Program do realizacji zamówień w JAVA

0

Witam forumowicze :)

Mam problem z napisaniem kompletnego kodu do pewnego zadania, poniżej treść:

Napisz program do realizacji zamówień. Program powinien składać się z dwóch klas:
Zamowienie oraz Pozycja, przy czym każde zamówienie może zawierać 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ę obliczWartosc(), zwracającą wartość pozycji zamówienia,
• metodę toString() zwracającą łańcuch w formacie: nazwa towaru, cena,
liczba sztuk, wartość zamówienia (oddzielone średnikami)
Klasa Zamowienie powinna zawierać następujące pola:
• pozycje (tablica obiektów klasy Pozycja) - pozycje składowe zamówienia,
• ileDanych (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,
• metodę String toString(), która zwraca łańcuch zawierający spis pozycji
zamówienia oraz łączną wartość zamówienia
Zdefiniuj klasę Test, która przetestuje powyższe metody.
Wynik, wyświetlony na ekranie dla dwóch produktów, może wyglądać następująco:
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ł

Problem pojawia się przy metodzie dodawania pozycji do zamówienia, z klasą test sobie poradzę (raczej).
Tyle udało mi się samemu zrobić:

import java.io.*;

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;
	}
	
	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;
	}
	
	Zamowienie(int maksRozmiar){
		this.maksRozmiar = maksRozmiar;
	}
	
    // Skorzystałem z rozwiązania w innym temacie (ale do C# i .NET), jednak dalej nie mogę sobie poradzić...

	public void dodajPozycje(Pozycja[] p){
		for(int i=0; i<pozycje.length; i++){
			if(pozycje[i] ==null)
				pozycje[i] = new Pozycja();
		}
	}
	
	public double obliczWartosc(){
		double lacznie = 0.0;
		for(int i=0; i<pozycje.length; i++){
			lacznie += pozycje[i].obliczWartosc();
		}
		return lacznie;
	}
	
	public String toString(){
		for(int i=0; i<pozycje.length; i++){
			 pozycje[i].toString();
		}
		return "Razem: " + obliczWartosc();
	}
	
}

Komunikat z konsoli:
a3e2b3ebde.png

Proszę o pomoc w rozwiązaniu, ewentualnie uwagi do reszty kodu mile widziane. :)

1

W klasie pozycja nie masz zdefiniowanego konstruktora domyślnego. Tak jak jest napisane w komunikacie, musisz zrobić

 new Pozycja("jakis string", 5, 10.2)

lub dodać konstuktor bezargumentowy w klasie Pozycja.

0

Ok, rozumiem. Tylko teraz jak będę dodawał pozycje do zamówienia to będzie mi nadpisywać to co byłoby domyślnie w metodzie dodajPozycje?

0

Nie do końca rozumiem w każdym razie w metodzie przekazujesz tablice i iterujesz po niej. Następnie dodajesz elementy do tablicy pozycje, ale sprawdzasz tez czy jest null, więc za drugim razem odpalając tą metodę z argumentem o wielkości nie większym niż poprzedni to nic Ci sie nie doda.

0

Poradziłem sobie inaczej (z pomocą kolegi z roku) :) w sumie na dwa sposoby, jeden z konstruktorem kopiującym w klasie Pozycja, drugi z akcesorami do pól w klasie Pozycja. Ten z konstruktorem kopiującym jest szybszy, łatwiejszy i lepiej wygląda, teraz wszystko wygląda tak:

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

Dzięki za pomoc, pozdrawiam! :)

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

Nie jestem pewien ale konstuktor kopiujacy dla tego samego obiektu to troche takie masło maślane. Wystarczy chyba coś takiego:

this.pozycje[ileDanych] = p;

1 użytkowników online, w tym zalogowanych: 0, gości: 1