• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie z Javy,nie wiem co dalej

VPS Starter Arubacloud
0 głosów
1,052 wizyt
pytanie zadane 4 sierpnia 2017 w Java przez Darek554 Użytkownik (980 p.)

Cześć mam pewien problem nietypowy problem zadaniem,ale najpierw jego treść:

Napisać klasę Lekarstwa, która umożliwia przechowanie i zarządzanie informacjami związanymi z aktualną listą leków. Na potrzeby zadania można założyć, że tablice są poprawnie uzupełnione. Klasa ta powinna zawierać następujące pola prywatne:

• String[] nazwa – tablica z nazwami leków,

• double[] cena – tablica z cenami poszczególnych leków (każda cena przypisana jest do leku zapisanego pod tym samym indeksem w tabeli),

• double[] refundacja – tablica z procentem refundacji danego leku (0.1, to 10% itp.).

Należy stworzyć konstruktor, w którym wszystkie nazwy leków zapisanych w tabeli zostają zapisane w taki sam sposób: pierwsza litera wielka, reszta małymi literami.

Metody publiczne:

• double cena(String lek, boolean ubezpieczony) – funkcja, która zwraca cenę leku, którego nazwa podana jest jako parametr funkcji. Jeśli parametr ubezpieczony ma wartość true, to cena zostaje obniżona o taki procent, jaki zapisany jest w tabeli refundacja.

• String maksymalnaRefundacji() – funkcja, która zwraca nazwę leku, do którego przysługuje największa refundacja kosztów z NFZ (jeśli lek kosztuje 3 zł i refundacja wynosi 50%, to NFZ dopłaca 1,5 zł, a jeśli lek kosztuje 100 zł, a refundacja wynosi 5%, to NFZ dopłaca 5 zł – w tym przypadku zwrócona zostanie nazwa drugiego leku). • double kosztCalkowity() – funkcja zwraca sumaryczny koszt zamówienia.

• void wyswietl() – funkcja wyświetla informacje o leku: jego nazwę, cenę oraz procent refundacji.

Napisałem wszystko do metody double cena(z nią włącznie),tylko że ja nie wiem w ogóle co ja napisałem,jak mam to wszystko wywołać w main'ie,uzupełnić te tablice w klasie itd.Nie wiem kompletnie co robić dalej. Czuję się jakbym pisał to co mi ktoś dyktuje,ale w obcym języku bez jakiegokolwiek zrozumienia.Mam nadzieję,że chociaż trochę rozumiecie o co mi chodzi. 

Oto kod:


package lekarstwa;

import java.util.Random;
import java.util.Scanner;
import lekarstwa.Leki.Lista;

public class Lekarstwa {

   
    public static void main(String[] args) {
        
        Random procent = new Random();
        Scanner wczytaj = new Scanner(System.in);
        
        float procentLosuj = procent.nextInt(1001) / 10.0f;
        System.out.format("%.1f%n" , procentLosuj);
        
        
        
        
    }

}

 

 

package lekarstwa.Leki;

public class Lista {

    public String[] nazwa;
    public double[] cena;
    public double[] refundacja;

    Lista(String[] nazwa,double[] cena,double[] refundacja)
    {
      this.nazwa = nazwa;
      this.cena = cena;
      this.refundacja = refundacja;
      }

    public double cena(String lek,boolean ubezpieczony)
    {
        for(int i=0;i<this.nazwa.length;i++){
            if(this.nazwa[i]==lek){
                if(ubezpieczony){
                    return this.cena[i] * this.refundacja[i] * 0.01;
                }
                else{
                    return this.cena[i];
                }
            }            
        }
        return 0;
    }
    
    String maksRefundacja(String[] nazwa)
    {
        double doplata,doplataMaks = 0;
        String ktory = " ";
                
        for(int i = 0; i<this.nazwa.length;i++)
        {
            doplata = this.cena[i]*this.refundacja[i]*0.01;
            if(doplata > doplataMaks)
            { 
                doplataMaks = doplata;
                ktory = this.nazwa[i];
            
            }
        }
        
       return ktory;
    }
}

Prosiłbym o pomoc 

6 odpowiedzi

+1 głos
odpowiedź 4 sierpnia 2017 przez adas94 Nałogowiec (29,200 p.)

To jakim cudem napisałeś względnie poprawny kod klasy Lista nie wiedząc co piszesz ? laugh W mainie musisz teraz utworzyć sobie te 3 tablice z danymi, a następnie stworzyć nowy obiekt klasy Lista i w parametrach konstruktora powrzucać te tablice. 

0 głosów
odpowiedź 4 sierpnia 2017 przez mbabane Szeryf (79,280 p.)
Coz to moze jakis kurs od podstaw?
0 głosów
odpowiedź 4 sierpnia 2017 przez Darek554 Użytkownik (980 p.)
Wiem,że to jest debilne iż napisałem poprawny kod a nie wiem jak to wykorzystać w main'ie,po prostu dostałem pier****a z tym programowaniem obiektowym,już mi się pieprzy wszystko...
komentarz 4 sierpnia 2017 przez mbabane Szeryf (79,280 p.)
hmm.. to proponuje odstawic to na kilka dni. Po tej przerwie odpal sobie jakis filmik instruktazowy, taki aby bylo pokazane wszystko od zera plus do tego jakis kurs czytany aby sobie utrwalic i na pewno to ogarniesz.
komentarz 4 sierpnia 2017 przez adas94 Nałogowiec (29,200 p.)
Może gdybyś chociaż potrafił wskazać co konkretnie jest dla ciebie problemem. Czego koncepcyjnie nie rozumiesz? To może człowiek byłby w stanie ci to wyjaśnić na zasadzie jakiejś prostej analogii. Bo robić cały wykład z obiektowości to tak średnio. ;d
0 głosów
odpowiedź 4 sierpnia 2017 przez ziemjok Gaduła (4,160 p.)

nie wiem w ogóle co ja napisałem,jak mam to wszystko wywołać w main'ie,uzupełnić te tablice w klasie

Nie możesz uzupełnić tablicy w klasie z poziomu main bo klasa sama w sobie nie istnieje. Musisz stworzyć w mainie obiekt klasy lista i przy tworzeniu poprzez konstruktor podać tablice

jak już będziesz mieć stworzony taki obiekt to możesz poprzez niego wywołać napisane metody

 

 void wyswietl() – funkcja wyświetla informacje o leku: jego nazwę, cenę oraz procent refundacji.

co do tego to wydaje mi się, że brakuje tu jakiegoś argumentu żeby można było napisać tą metodę

 

 

komentarz 4 sierpnia 2017 przez adas94 Nałogowiec (29,200 p.)

co do tego to wydaje mi się, że brakuje tu jakiegoś argumentu żeby można było napisać tą metodę

Przecież wystarczy w tej metodzie użyć pętli for i po kolei wypisywać wartości pól klasy (te 3 tablice). Także nie potrzeba żadnego parametru w tym przypadku. Wszystkie leki są niejako zlistowane we wnętrzu obiektu typu Lista. :)

komentarz 5 sierpnia 2017 przez ziemjok Gaduła (4,160 p.)
ale według podanej informacji "funkcja wyświetla informacje o leku" to chyba chodzi o wypisanie konkretnego leku a nie listy wszystkich leków
komentarz 5 sierpnia 2017 przez adas94 Nałogowiec (29,200 p.)
A to przepraszam bardzo, faktycznie do wyświetlenia jest pojedynczy lek, a nie wszystko.
0 głosów
odpowiedź 7 sierpnia 2017 przez Darek554 Użytkownik (980 p.)

Odstawiłem na parę dni programowanie tak jak radziłeś mbabane.

W main'ie zrobiłem coś takiego:


package lekarstwa;

import java.util.Random;
import java.util.Scanner;
import lekarstwa.Leki.Lista;

public class Lekarstwa {

   
    public static void main(String[] args) {
        
        Random procent = new Random();
        Scanner wczytaj = new Scanner(System.in);
        
        System.out.println("Podaj,ile leków chcesz dodać do bazy danych: ");
        int ile = wczytaj.nextInt();
        
        String[] nazwa = new String[ile];
        double[] cena = new double[ile];
        double[] refundacja = new double[ile];
         
        for(int i = 0; i < ile; i++)
        {
            double procentLosuj = procent.nextInt(1001) / 10.0f;
            
            System.out.println("Nazwa leku: ");
            String jaki = wczytaj.nextLine();
            nazwa[i] = jaki;
            
            System.out.println("Cena leku: ");
            double koszt = wczytaj.nextDouble();
            cena[i] = koszt;
            
            refundacja[i] = procentLosuj;
            
            Lista lista = new Lista(nazwa[i],cena[i],refundacja[i]); // Tutaj jest błąd
            
        }
        
    }

}

Tylko przy wpisywaniu wartości wyskakuje mi,że nie można konwertować String do String[].

komentarz 7 sierpnia 2017 przez adas94 Nałogowiec (29,200 p.)

Wyrzuć tą linijkę z pętli i pod klamrą napisz.

Lista lista = new Lista(nazwa, cena, refundacja);

 

komentarz 7 sierpnia 2017 przez Darek554 Użytkownik (980 p.)
W którym wierszu wrzucić tę linię,bo wklejam po pętli,przed pętlą i nadal jakieś błędy : P
komentarz 7 sierpnia 2017 przez adas94 Nałogowiec (29,200 p.)
Za klamrą która jest w 38 wierszu. I bez tych '[i]' wszędzie.
komentarz 7 sierpnia 2017 przez Darek554 Użytkownik (980 p.)
Ok,dzięki działa. :)

Błędy mi wyskakiwały gdyż konstruktor nie był public.

Tylko,znowu jest jakiś problem ; D

Kiedy skompiluję program i podam ilość leków,to wyświetla mi napis "Nazwa leku: " i od razu po nim(bez możliwości wpisania nazwy) przeskakuje do wczytywania ceny leku.

To jeden problem,a drugi (w zasadzie to pytanie),jak wyświetlić obiekt klasy lista w main'ie bez pisania metod w klasie Lista?
komentarz 7 sierpnia 2017 przez adas94 Nałogowiec (29,200 p.)

Zaraz w pierwszej linijce po forze (linia 24) dopisz

wczytaj.nextLine();

Dzięki temu program "zaczeka" aż wpiszesz wszystko po kolei. 

Jeżeli chodzi o wyświetlanie obiektu lista to wystarczy napisać 

lista.toString();

Z tym, że domyślnie zwróci to adres pod jakim znajduje się ten obiekt. Jeżeli chcesz, żeby wyświetlało nazwy pól itd. To musisz nadpisać metodę toString().  Ewentualnie możesz napisać własną metodę do wypisywania leków. (jedna pętla)

 

komentarz 7 sierpnia 2017 przez Darek554 Użytkownik (980 p.)

Jakim cudem po wpisaniu tego wczytaj.nextLine(); teraz wszystko działa???

Ogólnie to chyba sobie w łeb strzelę za chwilę,znowu jest kłopot z tym kodem,gdyż zawsze zwraca mi 1,jakby omijał if'a i else'a:

(Metoda z klasy lista)

 public double koszt(String lek,boolean ubezpieczony)
    {
        for(int i=0;i<this.nazwa.length;i++){
            if(this.nazwa[i]==lek){
                if(ubezpieczony){
                    return this.cena[i] * this.refundacja[i] * 0.01;
                }
                else{
                    return this.cena[i];
                }
            }            
        }
      return 1;
    }

Tutaj kod wywołania w main'ie:

        System.out.println("Jaki lek wypisać: ");
        String wybierzLek;
        wybierzLek = wczytaj.nextLine();
        
        System.out.println("");
        
        for(int i = 0; i < ile; i++)
        {
            System.out.println(nazwa[i] + " " + cena[i] + "zł." + " " + refundacja[i] + "%");
            System.out.println("");
        }

       double obnizka = lista.koszt(wybierzLek, true);
       
        System.out.println(obnizka);

 

komentarz 7 sierpnia 2017 przez adas94 Nałogowiec (29,200 p.)
edycja 8 sierpnia 2017 przez adas94

Po dodatkowym nextLine() działa ponieważ kiedy wykonuje się nextInt() - to tylko pobiera liczbę i zostaje w tej samej linii. Dlatego czytało Ci od razu po 2 razy nie czekając na to co wpiszesz. Z tym nextLine() to taka sztuczka w sumie. 

if pewnie nie działa przez 

if(this.nazwa[i]==lek)

this.nazwa[i] to String, lek to również String. W Javie Stringi porównuje się za pomocą equals(), a nie ==. Tak więc trzeba zmienić powyższą linijkę na :

if(this.nazwa[i].equals(lek))

 

 

komentarz 8 sierpnia 2017 przez Darek554 Użytkownik (980 p.)
Dzięki wielkie :)
0 głosów
odpowiedź 9 sierpnia 2017 przez Darek554 Użytkownik (980 p.)

Znowu ja,lecz tym razem inne zadanie : D

Przy kompilacji tego:


package zamówienie1;
import java.util.Scanner;

public class Zamówienie1 {


    public static void main(String[] args) {
       
       Scanner wczytaj = new Scanner(System.in);
       
       Zamowienie z = new Zamowienie();
       
       Pozycja p1 = new Pozycja("Cukier",2,3);
       
       z.dodajPozycje(p1); // Błąd
       
               
        
        
        /* Pozycja p = new Pozycja("Cukier",4,5);
        
        double x = p.obliczWartosc("Cukier");
        System.out.println(x);
        
        System.out.println("");
        System.out.println("");
        
       String y = p.toString("Cukier");
       System.out.println(y); */
    }

}

package zamówienie1;


public class Zamowienie {
    
    public Pozycja[] pozycje;
    public static int ileDodanych = 0;
    public static int maksRozmiar;
    public static int id = 0; 
    
    Zamowienie()
    {
        Zamowienie.maksRozmiar = 10;
    }
    
    Zamowienie(int ile)
    {
        Zamowienie.maksRozmiar = ile;
    }
    
    public void dodajPozycje(Pozycja p)
    {
            this.pozycje[id] = p; // Błąd
            ileDodanych++;
            id++;      
      }
    
    double obliczWartosc()
    {
        double wartosc = 0;
        
        for (Pozycja pozycje1 : pozycje) {
            if (pozycje1.equals(this.pozycje)) {
                wartosc += pozycje1.cena;
            }
        }
        
        return wartosc;
    }
}

Wyskakuje mi błąd NullPointerException w dwóch linijkach.

Wiecie może co to jest?  ; )

1
komentarz 9 sierpnia 2017 przez adas94 Nałogowiec (29,200 p.)
public Pozycja[] pozycje; 

To jeszcze nie jest tablica. I do tego przypisujesz

this.pozycje[id] = p;

Tymczasem nie ma do czego przypisać, bo nie zainicjalizowałeś tablicy za pomocą słowa kluczowego new. 

komentarz 9 sierpnia 2017 przez Darek554 Użytkownik (980 p.)
Zrobiłem tak:

package zamówienie1;


public class Zamowienie {
    
    public Pozycja[] pozycje = new Pozycja[maksRozmiar];
    public static int ileDodanych = 0;
    public static int maksRozmiar;
    public static int id = 0; 
    
    Zamowienie()
    {
        Zamowienie.maksRozmiar = 10;
    }
    
    Zamowienie(int ile)
    {
        Zamowienie.maksRozmiar = ile;
    }
    
    public void dodajPozycje(Pozycja p)
    {
            this.pozycje[id] = p;
            ileDodanych++;
            id++;      
      }
    
    double obliczWartosc()
    {
        double wartosc = 0;
        
        for (Pozycja pozycje1 : pozycje) {
            if (pozycje1.equals(this.pozycje)) {
                wartosc += pozycje1.cena;
            }
        }
        
        return wartosc;
    }
}

Wyskakuje to:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
	at zamówienie1.Zamowienie.dodajPozycje(Zamowienie.java:24)
	at zamówienie1.Zamówienie1.main(Zamówienie1.java:16)

 

komentarz 9 sierpnia 2017 przez Darek554 Użytkownik (980 p.)

Czegoś też nie rozumiem w tym kodzie np. również nie inicjalizowałem tablic a błąd nie wyskakuje:

package lekarstwa.Leki;


public class Lista {

    public String[] nazwa;
    public double[] cena;
    public double[] refundacja;

    public Lista(String[] nazwa,double[] cena,double[] refundacja)
    {
      this.nazwa = nazwa;
      this.cena = cena;
      this.refundacja = refundacja;
      }
    
    /////////////////////////////////////////////////////////////
    
    public double koszt(String lek,boolean ubezpieczony)
    {
        for(int i=0;i<this.nazwa.length;i++){
            if(this.nazwa[i].equals(lek)){
                if(ubezpieczony){
                    return this.cena[i] - this.cena[i] * this.refundacja[i] * 0.01;
                }
                else{
                    return this.cena[i];
                }
            }            
        }
      return 0;
    }

 

1
komentarz 9 sierpnia 2017 przez adas94 Nałogowiec (29,200 p.)
Wychodzisz poza zakres tablicy. Powinieneś ją zainicjalizować dopiero po tym jak się dowiesz jaką wartość ma zmienna "maksRozmiar".

Wcześniej nie było żadnego błędu, bo w parametrze przekazywałeś tablicę.

int tablica [] - to jeszcze nie tablica, natomiast w mainie stworzyłeś prawdziwą tablicę i wysłałeś ją w parametrze konstruktora. W konstruktorze napisałeś this.nazwa = nazwa i właśnie ta "nazwa" z parametru ma w sobie to "new" bo była przekazana jako tablica.
komentarz 9 sierpnia 2017 przez Darek554 Użytkownik (980 p.)

Ok,dzięki zrobiłem tak jak mówiłeś i faktycznie pomogło :)

Tylko teraz wyskakuje mi znów ten NullPointer, nie wiem o ch** znowu chodzi,już mi łeb pęka od tego...

Mam nadzieję,że to ostatni błąd w tym programie,bo nie chcę zawracać dupy ciągle:


package zamówienie1;


public class Zamowienie {
    
    
    public static int ileDodanych = 0;
    public static int maksRozmiar = 10;
    public static int id = 0; 
    public Pozycja[] pozycje = new Pozycja[maksRozmiar];
    
    Zamowienie()
    {
        Zamowienie.maksRozmiar = 10;
        }
    
    Zamowienie(int ile)
    {
        Zamowienie.maksRozmiar = ile;
        
    }
    
    
    
    public void dodajPozycje(Pozycja p)
    {
            this.pozycje[id] = p;
            ileDodanych++;
            id++;      
      }
    
    public double obliczWartosc()
    {
        double wartosc = 0;
        
        for (int i = 0; i < this.maksRozmiar; i++) {
          
                wartosc += this.pozycje[i].cena; //Tutaj
            }
        
        
        return wartosc;
    }
}

 

1
komentarz 9 sierpnia 2017 przez adas94 Nałogowiec (29,200 p.)
wartosc += this.pozycje[i].cena;

W tej tablicy masz na sztywno podane ile obiektów się w niej znajduje, np: 

[3] 

0

1

2

Jeżeli np dodałeś do swojej tablicy 2 obiekty klasy Pozycja, to Twoja tablica będzie wyglądała tak.

0 - pozycja

1 - pozycja

2 - null 

Myślę, że tutaj tkwi główny problem. W tej pętli for mielisz przez całą tablicę, a niekoniecznie wszystkie jej miejsca posiadają obiekt Pozycja. Nie ma obiektu pozycja = nie ma jak wywołać this.pozycje[i].cena

komentarz 9 sierpnia 2017 przez Darek554 Użytkownik (980 p.)
A już rozumiem,tylko jakby to obejść żebym nie musiał tworzyć tylu obiektów ile zawiera zmienna maksRozmiar?
1
komentarz 9 sierpnia 2017 przez adas94 Nałogowiec (29,200 p.)

Zainteresuj się takim zagadnieniem jak kolekcje. Zamiast używać tablicy 

Pozycja [] pozycje = new Pozycja[maks];

Użyj ArrayListy

List <Pozycja> pozycje = new ArrayList<>();

Jak widzisz nie musisz podawać rozmiaru, ArrayLista sama się dostosowuje. Żeby dodać coś do ArrayListy piszesz 

pozycje.add(pozycja1);

Po więcej informacji polecam wujka google. Jak wpiszesz "How to use ArrayList Java" dostaniesz pełno wartościowych materiałów.  

Natomiast jeżeli bardzo chcesz używać tablic, to po prostu nie przechodź przez całą tablicę jak tutaj : 

for (int i = 0; i < this.maksRozmiar; i++)

A zamiast tego przejdź tylko przez tyle danych, które posiadają obiekt klasy Pozycja. Twoja statyczna zmienna id zawiera tą informację, bo jest inkrementowana przy każdym dodaniu. Więc fora zmieć na coś takiego. 

for (int i = 0; i < id; i++)

Jednakże twój program i tak się wysypie jeśli ustalisz wielkość tablicy na 3 i będziesz dodawał czwarty obiekt, więc ArrayLista jest lepszym pomysłem. 

 

komentarz 10 sierpnia 2017 przez Darek554 Użytkownik (980 p.)
Dzięki wielkie,gdzie tu się daje jakieś pochwały czy coś? : D
komentarz 10 sierpnia 2017 przez adas94 Nałogowiec (29,200 p.)
Pech chciał, że ci wszystko wytłumaczyłem w komentarzach nie pod swoim postem, więc nie masz jak dać mi "najlepszej odpowiedzi". :D Ale jeżeli pomogłem, to super. ;)

Podobne pytania

0 głosów
4 odpowiedzi 369 wizyt
pytanie zadane 19 listopada 2017 w Java przez Kubs Mądrala (5,190 p.)
0 głosów
3 odpowiedzi 152 wizyt
pytanie zadane 1 marca 2018 w Java przez Rekus Użytkownik (500 p.)
0 głosów
2 odpowiedzi 617 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...