Java - Poczatkujący pytanie

Odpowiedz Nowy wątek
2019-11-27 15:29

Rejestracja: 4 miesiące temu

Ostatnio: 3 tygodnie temu

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());

   }
 }

Pozostało 580 znaków

2019-11-27 15:41
Moderator

Rejestracja: 16 lat temu

Ostatnio: 5 godzin temu

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<>();
//
}

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2019-11-27 15:43
@Shalom: Nie doczytałeś, zamówienie ma mieć tablicę pozycji ;) - cs 2019-11-27 15:46
Oh ty brutalu! - kixe52 2019-11-27 15:48

Pozostało 580 znaków

2019-11-27 15:55

Rejestracja: 4 miesiące temu

Ostatnio: 3 tygodnie temu

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 ?

Pozostało 580 znaków

2019-11-27 15:59

Rejestracja: 1 rok temu

Ostatnio: 2 dni temu

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?

Żadne, bo na pewno by mu przeszkadzało, że wszystko jest na czerwono :-) - lion137 2019-11-27 16:03
A jednak używa jakieś :O - kixe52 2019-11-27 16:05

Pozostało 580 znaków

cs
2019-11-27 16:01
cs

Rejestracja: 1 rok temu

Ostatnio: 2 dni temu

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.

Pozostało 580 znaków

2019-11-27 16:03

Rejestracja: 4 miesiące temu

Ostatnio: 3 tygodnie temu

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

Dobre do frontowych rzeczy. Pobierz intelij community / eclipse. - kixe52 2019-11-27 16:04
Nalegałbym na IntelliJ :-) - lion137 2019-11-27 16:07

Pozostało 580 znaków

2019-11-27 19:15

Rejestracja: 4 miesiące temu

Ostatnio: 3 tygodnie temu

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 ?

Pozostało 580 znaków

cs
2019-11-27 19:59
cs

Rejestracja: 1 rok temu

Ostatnio: 2 dni temu

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);
    }
edytowany 1x, ostatnio: cs, 2019-11-27 20:02

Pozostało 580 znaków

2019-11-27 22:57

Rejestracja: 4 miesiące temu

Ostatnio: 3 tygodnie temu

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)>

Pozostało 580 znaków

2019-11-27 23:36

Rejestracja: 6 lat temu

Ostatnio: 6 godzin temu

Lokalizacja: Kraków

0

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

Pozostało 580 znaków

2019-11-28 08:13

Rejestracja: 4 miesiące temu

Ostatnio: 3 tygodnie temu

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ć ?

Pozostało 580 znaków

Odpowiedz

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