Prośba o pomoc w kodzie, sprawdzenie błędów, wskazówki

0

Mam parę problemów z pewnym zadaniem. Może najpierw powiem o jakie zadanie chodzi:

Stworzyć klasę Sklep, reprezentującą jeden sklep w taki sposób, aby następujący program:

public class Test {

 public static void main(String[] args) {
    
    Sklep.setCenaHurtowa(1.5);
    Sklep.setCenaDetaliczna(3);
    Sklep sklep1 = new Sklep();
    Sklep sklep2 = new Sklep();
    Sklep sklep3 = new Sklep();
    sklep1.kupno(100);
    sklep2.kupno(200);
    sklep3.kupno(300);
    System.out.println("Sklepy: \n" + sklep1 + '\n' + sklep2 + '\n' + sklep3 + '\n');
    sklep1.sprzedaż(95);
    sklep2.sprzedaż(100);
    sklep3.sprzedaż(250);
    podajZyski(sklep1);      // uwaga: to jest wywołanie metody z klasy Test, 
    podajZyski(sklep2);      // którą to metodę też trzeba napisać    
    podajZyski(sklep3); 
  }

}

wyprowadził na konsolę podane wyniki:

Sklepy: 
Sklep nr 1 aktualny stan jabłek 100.0 kg
Sklep nr 2 aktualny stan jabłek 200.0 kg
Sklep nr 3 aktualny stan jabłek 300.0 kg

Sklep nr 1 aktualny stan jabłek 5.0 kg
Wydatki: 150.0
Dochody: 285.0
Zysk   : 135.0

Sklep nr 2 aktualny stan jabłek 100.0 kg
Wydatki: 300.0
Dochody: 300.0
Zysk   : 0.0

Sklep nr 3 aktualny stan jabłek 50.0 kg
Wydatki: 450.0
Dochody: 750.0
Zysk   : 300.0

Uwaga: wszystkie pola klasy Sklep muszą być prywatne.

Oto mój kod:

class Sklep {
 
 private static double CenaHurtowa, CenaDetaliczna;
 private static int ileKupiono, ileSprzedano;
 private double wydatki, dochody, zostalo;
 private static int numer=0;
 private int nr;
 
 public Sklep(){
      numer++;
      nr=numer;
      }
  
 public static void setCenaHurtowa(double x) { 
    CenaHurtowa = x;
    }
 
 public static void setCenaDetaliczna(double y) { 
    CenaDetaliczna = y;
    }
 
 public static void kupno(int x){
    int ileKupiono = x;
 }
 
 public static void sprzedaz(int y){
    int ileSprzedano = y;
 
 }
 
 public double obliczWydatki(){
    wydatki = CenaHurtowa * ileKupiono;
    return wydatki;
    }
 
 public double obliczDochody(){
  dochody = CenaDetaliczna * ileSprzedano;
  return dochody;
        }
 
 public double ileZostalo(){
    zostalo = ileKupiono - ileSprzedano;
    return zostalo;
    }
 
 public String toString() {
    return "Sklep nr " + nr + " aktualny stan jablek " + ileKupiono + " kg";
 
  }
 
   public String wynik() {
    String wynik =  "Sklep nr " + nr + " aktualny stan jablek " + zostalo +  "kg\nWydatki:" + wydatki + "\nDochody:" + dochody + "\nZyski:";
 return wynik;
  }
 
}
 
 
public class Test {
 
 public static void main(String[] args) {
 
    Sklep.setCenaHurtowa(1.5);
    Sklep.setCenaDetaliczna(3);
 
    Sklep sklep1 = new Sklep();
    Sklep sklep2 = new Sklep();
    Sklep sklep3 = new Sklep();
 
    sklep1.kupno(100);
    sklep2.kupno(200);
    sklep3.kupno(300);
 
    System.out.println("Sklepy: \n" + sklep1 + '\n' + sklep2 + '\n' + sklep3 + '\n');
 
    sklep1.sprzedaz(95);
    sklep2.sprzedaz(100);
    sklep3.sprzedaz(250);
 
 public double podajZyski(){
      zyski = (Sklep.kupno()*Sklep.setCenaHurtowa()) - (Sklep.sprzedaz()*Sklep.setCenaDetaliczna());
      return zyski;
    }
 
    podajZyski(sklep1);      
    podajZyski(sklep2);        
    podajZyski(sklep3); 
 
    System.out.println("Sklepy: \n" + sklep1.wynik() + podajZyski(sklep1) + '\n' + sklep2.wynik() + podajZyski(sklep2) + '\n' + sklep3.wynik() + podajZyski(sklep3) + '\n');
    
  } 
}

Problemy jakie mi się pojawiły:

  1. O ile udało mi się poprawić numery sklepów, które już wyliczone są poprawnie to nie wiem czemu konsola pokazuje aktualny stan 0kg w każdym przypadku... może to banalny błąd, ale nie wiem co jest źle
  2. Program działa tylko gdy:
 public double podajZyski(){
      zyski = (Sklep.kupno()*Sklep.setCenaHurtowa()) - (Sklep.sprzedaz()*Sklep.setCenaDetaliczna());
      return zyski;
    }
 
    podajZyski(sklep1);      
    podajZyski(sklep2);        
    podajZyski(sklep3); 
 
    System.out.println("Sklepy: \n" + sklep1.wynik() + podajZyski(sklep1) + '\n' + sklep2.wynik() + podajZyski(sklep2) + '\n' + sklep3.wynik() + podajZyski(sklep3) + '\n');

dam jako komentarz, inaczej nie chce skompilować. Normalnie dałabym tą metodę w klasie sklep ale w poleceniu jest, że musi być w klasie Test i tu pojawia się problem bo chyba robię to źle.

Z góry przepraszam jeśli mój problem jest banalny, ale naprawdę potrzebuję pomocy, by swoje głupie błędy zauważyć i potem ich już nie popełniać.

dodanie znaczników <quote>, <code> i <code class="java"> - Furious Programming

0

Funkcja podajZyski jest napisana w funkcji main. Napisz ją w klasie Test. Jako argument może przyjmować obiekt klasy Sklep i dla konkretnego obiektu obliczać zysk.

0

a czy komentarz do zadania:

 
         // uwaga: to jest wywołanie metody z klasy Test, 
        // którą to metodę też trzeba napisać 
    

nie oznacza, że ma być w klasie Test, a nie Sklep? Własnie mnie to zbiło z tropu i nie wiedziałam jak się za to zabrać...

A dlaczego w każdym przypadku stan sklepu pokazuje 0?

0

teraz klasa Test wygląda tak:

public class Test2 {
	
      public double podajZyski(){
      double zyski = (Sklep.kupno()*Sklep.setCenaHurtowa()) - (Sklep.sprzedaz()*Sklep.setCenaDetaliczna());
      return zyski;
    }
 
 public static void main(String[] args) {
 
    Sklep.setCenaHurtowa(1.5);
    Sklep.setCenaDetaliczna(3);
 
    Sklep sklep1 = new Sklep();
    Sklep sklep2 = new Sklep();
    Sklep sklep3 = new Sklep();
 
    sklep1.kupno(100);
    sklep2.kupno(200);
    sklep3.kupno(300);
 
    System.out.println("Sklepy: \n" + sklep1 + '\n' + sklep2 + '\n' + sklep3 + '\n');
 
    sklep1.sprzedaz(95);
    sklep2.sprzedaz(100);
    sklep3.sprzedaz(250);
    
 	podajZyski(sklep1);      
    podajZyski(sklep2);        
    podajZyski(sklep3); 
 
    System.out.println("Sklepy: \n" + sklep1.wynik() + podajZyski(sklep1) + '\n' + sklep2.wynik() + podajZyski(sklep2) + '\n' + sklep3.wynik() + podajZyski(sklep3) + '\n');
 
  } 
} 
 java:62: error: method kupno in class Sklep cannot be applied to given types;

Co powinnam tam jeszcze poprawić? Tak by pobierało dobre dane?

0

Zysk źle liczysz.

public double podajZyski(Sklep sklep){
      
      return sklep.obliczDochody()-sklep.obliczWydatki();
    }
0

Popatrz na te metody które wywołujesz w tej funkcji. Co to są w ogóle za metody? Zrób tak aby ten zysk był obliczany dla konkretnego sklepu więc przydałoby się jako argument funkcji podać obiekt klasy Sklep o czym już Ci pisałem.

0
	public double podajZyski(Sklep sklep){
		double zyski =  sklep.obliczDochody()-sklep.obliczWydatki();
		return zyski;
    }
 

zmieniłam.

 error: non-static method podajZyski(Sklep) cannot be referenced from a static context
 	podajZyski(sklep1);      
 
0

To jeszcze metoda podajZysk musi być statyczna, wywal static z ileKupiono i ileSprzedano i z metod kupno i sprzedarz. Wywal int w tych meotdach.

0

Wg mnie to informacje:

Sklep nr 1 aktualny stan jabłek 5.0 kg
Wydatki: 150.0
Dochody: 285.0
Zysk   : 135.0

powinna drukować statyczna metoda klasy Test* o nazwie podajZysk()

0
dam1an napisał(a):

To jeszcze metoda podajZysk musi być statyczna, wywal static z ileKupiono i ileSprzedano i z metod kupno i sprzedarz. Wywal int w tych meotdach.

Metoda podajZyski już poprawiona, a co do metod kupno i sprzedasz, to chodzi Ci o coś takiego:

  public double kupno(){
    return ileKupiono;
 }
 
 public double sprzedaz(){
    return ileSprzedano;
 
 }

?

0
_13th_Dragon napisał(a):

Wg mnie to informacje:

Sklep nr 1 aktualny stan jabłek 5.0 kg
Wydatki: 150.0
Dochody: 285.0
Zysk   : 135.0

powinna drukować statyczna metoda klasy Test* o nazwie podajZysk()

zrobiłam tak:

 	static String podajZyski(Sklep sklep){
		double zyski =  sklep.obliczDochody()-sklep.obliczWydatki();
		String wynik = sklep.wynik() + zyski + '\n';
		return wynik;
    }

Teraz, gdy wyrzuciłam static i int z metod kupno i sprzedarz, pojawia się błąd:

 error: method kupno in class Sklep cannot be applied to given types; 
 sklep1.kupno(100);
1

Kupno i sprzedaż miały wyglądać tak:

public void kupno(int x){
    ileKupiono = x;
 }
 
 public void sprzedaz(int y){
    ileSprzedano = y;

Pokaż lepiej cały kod.

Ogólnie żeby zrobić coś takiego

kupno(100);

definicja metody musi uwzględniać to że podajesz parametr w nawiasach.

0

Dziękuję, choć jakoś wczoraj udało mi się już to pozmieniać i już nie ma błędów w kompilacji ale teraz program pokazuje takie same wyniki dla każdego sklepu, dodatkowo po zmianie aktualny stan wynosi 0.

Cały kod:

class Sklep {
 
 private static double CenaHurtowa, CenaDetaliczna;
 private static int ileKupiono, ileSprzedano;
 private double wydatki, dochody, zostalo;
 private static int numer=0;
 private int nr;
 
 public Sklep(){
      numer++;
      nr=numer;
      }
  
 public static void setCenaHurtowa(double x) { 
    CenaHurtowa = x;
    }
 
 public static void setCenaDetaliczna(double y) { 
    CenaDetaliczna = y;
    }
 
 public void kupno(int x){
    ileKupiono = x;
 }
 
 public void sprzedaz(int y){
    ileSprzedano = y;
 
 }
 
 public double obliczWydatki(){
    wydatki = CenaHurtowa * ileKupiono;
    return wydatki;
    }
 
 public double obliczDochody(){
  dochody = CenaDetaliczna * ileSprzedano;
  return dochody;
        }
 
 public double ileZostalo(){
    zostalo = ileKupiono - ileSprzedano;
    return zostalo;
    }
 
 public String toString() {
    return "Sklep nr " + nr + " aktualny stan jablek " + ileKupiono + " kg";
 
  }
 
   public String wynik() {
    String wynik =  "Sklep nr " + nr + " aktualny stan jablek " + zostalo +  "kg\nWydatki:" + wydatki + "\nDochody:" + dochody + "\nZyski:";
 return wynik;
  }
 
}
 
 
public class Test {
	
	static String podajZyski(Sklep sklep){
		double zyski =  sklep.obliczDochody()-sklep.obliczWydatki();
		String wynik = sklep.wynik() + zyski + '\n';
		return wynik;
    }
 
 public static void main(String[] args) {
 
    Sklep.setCenaHurtowa(1.5);
    Sklep.setCenaDetaliczna(3);
 
    Sklep sklep1 = new Sklep();
    Sklep sklep2 = new Sklep();
    Sklep sklep3 = new Sklep();
 
    sklep1.kupno(100);
    sklep2.kupno(200);
    sklep3.kupno(300);
 
    System.out.println("Sklepy: \n" + sklep1 + '\n' + sklep2 + '\n' + sklep3 + '\n');
 
    sklep1.sprzedaz(95);
    sklep2.sprzedaz(100);
    sklep3.sprzedaz(250);
    
 	podajZyski(sklep1);      
    podajZyski(sklep2);        
    podajZyski(sklep3); 
 
    System.out.println("Sklepy: \n" + podajZyski(sklep1) + '\n' + podajZyski(sklep2) + '\n' + podajZyski(sklep3) + "\n\n");
 
  } 
} 
1

Usuń static w:

private static int ileKupiono, ileSprzedano;
1

to: private int ileKupiono, ileSprzedano; nie może być static ponieważ każdy sklep ma inną wartość.

0

Zmieniłam. Już jest dobrze, to znaczy nie oblicza jeszcze aktualnego stanu po zmianie czyli

  public double ileZostalo(){
    zostalo = ileKupiono - ileSprzedano;
    return zostalo;
    }
1

Zmień te dwie metody na takie:

public void kupno(int x) {
    ileKupiono = x;
    zostalo += x;
}
 
public void sprzedaz(int y) {
    zostalo -= y;
    ileSprzedano = y;
}

Albo przerób ten kod na jakiś bardziej sensowny.

0

Wywal private double wydatki, dochody, zostalo; zaś powyższą funkcje zapisz tak:

public double ileZostalo() { return ileKupiono - ileSprzedano; }
0

Bardzo Wam dziękuję :) już działa jak należy.

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