Java - Poczatkujący pytanie

0

Cześć , mam problem jestem na pierwszym roku informatyki więc nie bardzo potrzebuje bardzo skomplikowanych rozwiązań , wykładowca kazał wykonać program .
Zad. Zamówienie

  1. 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ł
  2. 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
  3. 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%.
  4. 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.
  5. zmodyfikować metodę toString , by wyświetlała również naliczony rabat i wartość z rabatem.
  6. 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.

Nie proszę o zrobienie takiego programu , tylko o powiedzenie mi co robię zle w aktualnym ze nie czyta mi Geterów,
taki błedy Type mismatch: cannot convert from Pozycja[] to Zamowienie
Type mismatch: cannot convert from Pozycja[] to Zamowienie
Type mismatch: cannot convert from Pozycja to Zamowienie
Type mismatch: cannot convert from Pozycja to Zamowienie
The method getNazwaTowaru() is undefined for the type Zamowienie
The method getIleSztuk() is undefined for the type Zamowienie
The method getCena() is undefined for the type Zamowienie
The method getCenarazem() is undefined for the type Zamowienie

import  java.io.*;
import java.utill.*;


    

public class Pozycja{

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

    public Pozycja(String n, int sz, double c){
        nazwaTowaru = n;
        ileSztuk = sz;
        cena = c;
     }
     
     
    public String getNazwaTowaru(){
    return nazwaTowaru;
    }
    public int getIleSztuk(){
    return ileSztuk;
    }
    public double getCena(){
    return cena;
    }
    public void raiseCena(double byPercent){
     raise= Cena * byPercent / 100;
    }
     public  double getCenarazem(){
     Cena *= ileSztuk;
   }
}


public class Zamowienie  {

   

   public Zamowienie(String n, int sz, double c) {
      super(n, sz, c);
    
   }

   public static void main(String[] args) {
    Zamowienie as1 = new Pozycja[1];
    Zamowienie as2 = new Pozycja[2];
    as1 = new Pozycja ("cukier", 3, 4);
    as2 = new Pozycja ("chleb", 3, 5);
    
    System.out.println("nazwa: " ,( +getNazwaTowaru()), "ilość :"  + getIleSztuk(), "Cena: "  + getCena() , "razem : " + getCenarazem());
    
   }
 }
  
0

Problem jest taki że nie rozumiesz treści zadania.

każde zamówienie zawierać może jedną lub więcej pozycji

U ciebie zamówienie NIE MA ŻADNYCH PÓL. Ani jednego ani wielu.
Dalej robisz jakieś super(n, sz, c); podczas gdy klasa Zamowienie nie dziedziczy z niczego (i dobrze!), więc co ma niby robić to super?
Nastepnie masz Zamowienie as1 = new Pozycja[1]; czyli próbujesz do zmiennej as1 typu Zamowienie przypisać jednoelementową TABLICĘ obiektów Pozycja. Jaki to w ogóle ma niby sens?

Ta klasa Pozycja może zostać, reszta leci do kosza i trzeba napisać od nowa. Zacznij od

public class Zamowienie  {
    private final List<Pozycja> orderItems = new ArrayList<>();
//
}
0

Dzięki za odpowiedz , jednak nadal mam problem z tym ze nie bardzo wiem jak mam to zrobić , może macie jakiś podobny gotowy kod żebym mógł się zorientować co i jak ?

0

Nie mamy. Musisz wrócić do podstawy podstaw. Typy, tworzenie obiektów, dziedziczenie, tablice, zwracanie wyników przez metody.

Metody: raiseCena oraz getCenarazem ?????????????

Jakie IDE używasz do nauki?

0

Najpierw zdefiniuj klasę Zamowienie dokładnie jak masz w treści zadania, dla metod napisz tylko sygnatury i zostaw puste ciała, potem zastanów się jak je zdefiniować i do czego Ci potrzebne pola IleDodanych i maksRozmiar. Potem zadaj konkretne pytania. Powodzenia.

0

Używam visual studio code (czy to dobre?) , Wracam do podstaw tylko czekam na odpowiedz czy z dobrego środowiska korzystam i można zamknąć. Wielkie dzieki

0

W sumie zrobilem to w dwóch plikach .

class Pozycja {

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

    public Pozycja(String n, int sz, double c) {
        nazwaTowaru = n;
        ileSztuk = sz;
        cena = c;
    }


    public String getNazwaTowaru() {
        return nazwaTowaru;
    }

    public int getIleSztuk() {
        return ileSztuk;
    }

    public double getCena() {
        return cena;
    }

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

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


I w drugim

public class Zamowienie{

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

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

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


    public double dodajPozycje(Pozycja p) {
        if (this.pozycje[ileDanych] == null) {
            this.pozycje[ileDanych] = new Pozycja(p.getNazwaTowaru(), p.getIleSztuk(), p.getCena());
            this.ileDanych++;
        }
        return dodajPozycje(p);
    }





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


    public static void main(String[] args) {

        Pozycja p1 = new Pozycja("Chleb", 1, 3.5);
        System.out.println(p1);
        Pozycja p2 = new Pozycja("Cukier", 6, 4);
        System.out.print(p2);
    }
}

Teraz takie pytanko , w sumie nie wiem czy to czyta tez klasę pierwsza wiec prosiłbym o potwierdzenie ,i program działa , wyrzucilibyscie albo zmienilibyscie w nim cos ?

1

Działa??? Poczekaj, aż zaczniesz działać z obiektami klasy Zamowienie.
Do poprawy:

  • Uzupełnij konstruktor z parametrem o tworzenie tablicy pozycje, a w konstruktorze bezparametrowym wywołaj tylko konstruktor z parametrem 10.
  • W metodzie
 public double dodajPozycje(Pozycja p) {
        if (this.pozycje[ileDanych] == null) { //a
            this.pozycje[ileDanych] = new Pozycja(p.getNazwaTowaru(), p.getIleSztuk(), p.getCena()); //b
            this.ileDanych++;
        }
        return dodajPozycje(p); \\c
    }

a) po co jest ten warunek? Powinieneś sprawdzić raczej czy ileDanych jest w zakresie indeksów tablicy pozycje.
b) nie wiem, czy o to chodziło, wyczuwam, że raczej powinno być pozycje[ileDanych] = p;
c) zmieniłeś sygnaturę metody i wywołujesz ją rekurencyjnie, wg treści zadania powinno to być void dodajPozycje(Pozycja p), czyli to return do wywalenia

  • metoda obliczWartosc()
private double obliczWartosc() { //a
        double lacznie = 0.0;
        for (int i = 0; i < ileDanych; i++) lacznie += pozycje[i].obliczWartosc();  //b
        return  lacznie;
    }

a) dlaczego ta metoda jest prywatna? Czy nie powinna być publiczna?
b) zawsze dodawaj blok do instrukcji iteracyjnych, nawet, gdy jest zbędny (jedna instrukcja) !!!
Uzupełnij funkcję main o resztę kodu i teraz sprawdź co się dzieje:

...
Zamowienie z = new Zamowienie(20);
z.dodajPozycje(p1);
z.dodajPozycje(p2);
System.out.println(z);
}
0
public class Zamowienie{

    private Pozycja[] pozycje;

    private int ileDanych;
    private final int maksRozmiar;

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

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


    public void dodajPozycje(Pozycja p) {
        if (this.pozycje[ileDanych] == null) {
            pozycje[ileDanych] = p;
            this.ileDanych++;
        }

    }





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


    public static void main(String[] args) {

        Pozycja p1 = new Pozycja("Chleb", 1, 3.5);
        System.out.println(p1);
        Pozycja p2 = new Pozycja("Cukier", 6, 4);
        System.out.print(p2);
        Zamowienie z = new Zamowienie(20);
        z.dodajPozycje(p1);
        z.dodajPozycje(p2);
        System.out.println(z);
    }
    }

Poprawiłem trochę , resztę niestety nie bardzo wiem o czym mówisz , błąd to :

Exception in thread "main" java.lang.NullPointerException
at Zamowienie.dodajPozycje(Zamowienie.java:20)
at Zamowienie.main(Zamowienie.java:55)>

0

private Pozycja[] pozycje; jest nullem. Odpal debugger.

0

Nie wiem jak ten debugger działa , ale po włączeniu go niczego się nie dowiedziałem a zwrócił taki sam błąd . Ktoś wie jak to naprawić ?

0

Zainicijalizować zmienną która jest nullem.

0
  1. Tzn, że nic w nim nie sprawdziłeś. Umiejętność obsługi debuggera to ważna rzecz.
  2. @szweszwe dał Ci już odpowiedź. Musisz zainicjalizować tablicę Pozycja[] pozycje;
1

Tworzysz zamówienie:

Zamowienie z = new Zamowienie(20);

wywołując konstruktor z parametrem, czy ten:

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

a w nim NIE TWORZYSZ tablicy pozycje, więc tablica jest nullem, ale poprawnie wszystko jest zrobione w konstruktorze bezparametrowym:

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

To co jest w tym konstruktorze przenieś do tego z parametrem, w bezargumentowym wywołaj this(10);

0

Tym razem wszystko gra ,

public class Zamowienie{

    private Pozycja[] pozycje;





    private int ileDanych;
    private final int maksRozmiar;

    Zamowienie(){
        this(10); 
    }

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


    public void dodajPozycje(Pozycja p) {
        if (this.pozycje[ileDanych] == null ) {
            pozycje[ileDanych] = p;
            this.ileDanych++;
        }

    }





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


    public static void main(String[] args) {

        Pozycja p1 = new Pozycja("Chleb", 1, 3.5);
        
        Pozycja p2 = new Pozycja("Cukier", 6, 4);
        
        Zamowienie z = new Zamowienie(20);
        z.dodajPozycje(p1);
        z.dodajPozycje(p2);
        System.out.println(z);
    }
    }

Zamówienie:
Chleb; 3,50 zł; 1 szt; 3,00 zł
Cukier; 4,00 zł; 6 szt; 24,00 zł
Razem: 106,00 zł>

Jakim cudem Razem = 106 zl ?

1

Musisz nauczyć się obsługiwać debugger bo żeby ktoś za ciebie to robił to jest lekka przesada. I nie, że włączyłem ale nic się nie naprawiło bo samo się nie naprawi, musisz zobaczyć w necie jak go używać. Twoje obliczWartosc zwraca wartość ale liczy ją za każdym razem od nowa i aktualizuje wartości w obiekcie.

0

@Dreams1337: raczej powineneś tez unikac stosowania "gołych" tablic tylko stosowac kolekcje jak listy, sety etc

0

Całkowicie nie wiem jak mam zrobić metode która bedzie usuwac pozycje z tablicy (usunpozycje) , mozecie mnie naprowadzic?

public class Zamowienie{

    private Pozycja[] pozycje;





    private int ileDanych;
    private final int maksRozmiar;

    Zamowienie(){
        this(10);
    }

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

        this.ileDanych = 0;
        this.pozycje = new Pozycja[this.maksRozmiar];
    }


    public void dodajPozycje(Pozycja p) {
        if (this.pozycje[ileDanych] == null ) {
            pozycje[ileDanych] = p;
            this.ileDanych++;
        }

    }


    void usunPozycje(int indeks){
        return;
    }

    void edytujPozycje(int indeks){
        return;
    }






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


    public static void main(String[] args) {

        Pozycja p1 = new Pozycja("Chleb", 1, 3);

        Pozycja p2 = new Pozycja("Cukier", 6, 4);

        Zamowienie z = new Zamowienie(20);
        z.dodajPozycje(p1);
        z.dodajPozycje(p2);
        System.out.println(z);
        System.out.println();
    }
    }

0

Zamiast tablicy użyj ArrayList. Wówczas usuwanie elementu ograniczy się do pozycje.remove(indeks).
https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html#remove-int-

0

Kompletnie zieleniałem , powiesz mi gdzie mam tego uzyć i czy w dalszym kodzie musze wszystko zmieniac?

0

Gdybym mógł sobie poradzić to bym tutaj nie pisał, po prostu od 2 dni nie mogę posunąć się dalej -_-

1

Po minimalnych przeróbkach (nadal nie jest to wersja de luxe z wielu względów). Nie bardzo rozumiem sens takiej nauki, ale ująłeś mnie za serce.

public class Zamowienie {

    private final List<Pozycja> pozycje;

    Zamowienie() {
        this(10);
    }

    Zamowienie(int maksRozmiar) {
        this.pozycje = new ArrayList<>(maksRozmiar);
    }

    public void dodajPozycje(Pozycja p) {
        pozycje.add(p);
    }

    void usunPozycje(int indeks) {
        pozycje.remove(indeks);
    }

    void edytujPozycje(int indeks) {
        return;
    }

    public BigDecimal obliczWartosc() {
        BigDecimal lacznie = BigDecimal.ZERO;
        for (Pozycja p : pozycje) {
            lacznie = lacznie.add(p.obliczWartosc());
        }
        return lacznie;
    }

    public String toString() {
        StringBuilder napis = new StringBuilder("\nZamówienie:\n");
        for (Pozycja p : pozycje) {
            napis.append(p.toString()).append("\n");
        }
        napis.append("Razem: ").append(String.format("%.2f", obliczWartosc())).append(" zł");
        return napis.toString();
    }
}
0

Nie tyle co oszukał, co nie potrafi się uczyć nie widząc konkretnego przykładu a na internecie nigdzie ich nie ma jak wykorzystać w ten sposob ( a jak sa to jakos tego nie ogarniałem ) Wielkie dzieki. Pozdrawiam

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