Zadanie pracownicy - sprawdzenie i ew. poprawienie kodu

0

Zad. 1 Pracownicy (4 p.)

Stworzyć klasę Employee (pracownik), opisującą wspólne atrrybuty pracowników:

  • imię,
  • nazwisko,
  • wiek,
  • pensja.

oraz zawierającą odpowiednie metody, które pozwolą w programie testującym dla kilku pracowników:

  • uzyskać opis pracownika,
  • zmienić pensję o podany procent.
public class Employee {

	public String imie;
	public String nazwisko;
	public int wiek;
	public double pensja;
	public double zmianaPensji;

	// ................................. ATRYBUTY PRACOWNIKOW

    public Employee (){
    }

	public String podajImie(){
    	return imie;
	}

	public String podajNazwisko(){
    	return nazwisko;
	}

	public int podajWiek(){
   		return wiek;
	}

   public double podajPensje(){
      return pensja;
   }

   	// ..................... OPIS PRACOWNIKA I ZMIANA PENSJI O DANY PROCENT

   public String toString(){
      return imie + " " + nazwisko + ", wiek: " + wiek + " lat, pensja: " + pensja;

   }

   public double zmianaPensji(){
      zmianaPensji = pensja+((zmianaPensji/100.0)*pensja);
      return zmianaPensji;
   }

   public Employee(String imie, String nazwisko, int wiek, double pensja){
      this.imie = imie;
      this.nazwisko = nazwisko;
      this.wiek = wiek;
      this.pensja = pensja;
   }

  }

Zad. 2 Pracownicy II (4 p.)

Użyć klasy z poprzedniego zadania w innej klasie, w której dostarczymy:

metody definiowania danych o pracownikach:

Employee defEmp(String msg)

która w dialogu wejściowym pyta użytkownika o dane pracownika (argument msg jest wspólną częścią komunikatu wyświetlanego w oknie dialogowym przy pytaiu o różne dane dla pracownika, może to być np. "Pracownik 1"), tworzy obiekt, reprezentujący wprowadzone dane o pracowniku i zwraca referencję do niego.

metody showInfo(Employee), która wyświetla w dialogu komunikatów dane o podanym jako argument pracowniku

metody changeSalary(Employee), która pyta o procent o jaki chcemy zmienić pensję podanego jako argument pracownika i zmienia tę pensję..

W metodach zadbać o obsługę błędów.

Przetestować te metody na przykładzie wprowadzenia danych dla 3 pracowników, pokazania tych danych, zmiany pensji i pokazania zmienionych danych.

import javax.swing.JOptionPane;

 public class Emp {

   public Employee defEmp(String msg){

      Employee newEmployee = new Employee();

      String imie = JOptionPane.showInputDialog("Podaj imię pracownika");
      	if (imie == null){
      	 	imie = "";
      	 	}
      	newEmployee.imie = imie;                    

      String nazwisko = JOptionPane.showInputDialog("Podaj nazwisko pracownika");
      	if (nazwisko == null){
      	  	nazwisko ="";
    	 	}
      	newEmployee.nazwisko = nazwisko;                    

      String w = JOptionPane.showInputDialog("Podaj wiek pracownika");
      	if(w == null){
           w = "";
          }
      	int wiek = Integer.parseInt(w);
      	newEmployee.wiek = wiek;   


      String p = JOptionPane.showInputDialog("Podaj pensje pracownika");
     	 if(p == null){
      		p = "";
      		}
     	 double pensja = Double.parseDouble(p);
      	 newEmployee.pensja = pensja;

      return newEmployee;
  }

   public static void changeSalary(Employee emp){

  	Employee newEmployee = new Employee();

      String zmiana = JOptionPane.showInputDialog("Podaj o ile zmienić pensję");
       int zmianaPensji = Integer.parseInt(zmiana);
       if (zmiana == null){
       newEmployee.zmianaPensji = newEmployee.pensja;
       }
       else {
       newEmployee.zmianaPensji = zmianaPensji;
       }

      }

   public static void showInfo(Employee emp) {
      JOptionPane.showMessageDialog(null, msg);
  }



    public static void main(String[] args) {

   	  String dane = JOptionPane.showInputDialog(msg);
      if (dane == null){
      	  dane = "Nie wprowadzono danych";
      	 } 

   	  else {
         JOptionPane.showMessageDialog(null, msg);
         }
   }
}
error: cannot find symbol
        JOptionPane.showMessageDialog(null, msg);
  symbol:   variable msg
  location: class Emp

error: cannot find symbol
   	  String dane = JOptionPane.showInputDialog(msg); 	                                            
  symbol:   variable msg
  location: class Emp

error: cannot find symbol
         JOptionPane.showMessageDialog(null, msg);
  symbol:   variable msg
  location: class Emp

3 errors

Mam problem z drugim zadaniem a mianowicie z metodą showInfo(Employee) i changeSalary(Employee). Posiłkowałam się rozwiązaniami z internetu, jednak wiele z nich miało błędy, dlatego postanowiłam napisać to w swojej wersji i pojawił się właśnie problem z tymi metodami. Nie wiem co powinnam zmienić i jak ten program dokończyć. Mam nadzieje, że chociaż zadanie 1 jest rozwiązane dobrze.
Bardzo proszę o pomoc.

dodanie znaczników <code>, <code class="java"> i `` - fp

0

W pierwszym zadaniu wywal z klasy zmienna zmianaPensji. Nie musisz jej przechowywać, powinien to byc jedynie argument metody zmianaPensji, który pozwala na obliczenie nowej pensji.
Twoja metoda zmianaPensji w tej chwili nie ma sensu bo nie zmienia wartosci PENSJA obiektu. Nie będę podawać gotowca, zastanów sie nad tym :)

Co do errorów... no jest napisane, że nie może znaleźć "msg", a to dlatego, że w mainie(i w pewnej innej metodzie) nie masz takiej zmiennej... wrzuć tam z góry zdefiniowany String "TO JEST TESTOWY STRING MSG".

Zresztą w tej chwili nie ma sensu main :P ale błędy są przez to

0

Do do metody ZmianaPensji, to mam teraz coś takiego:

   public double zmianaPensji(double zmianaPensji){
      pensja = pensja+((zmianaPensji/100.0)*pensja);
      return pensja;
   } 

i

    public static void changeSalary(Employee emp){
 
  	Employee newEmployee = new Employee();
  		
      String zmiana = JOptionPane.showInputDialog("Podaj o ile zmienić pensję");
       double zmianaPensji = Double.parseDouble(zmiana);
       newEmployee.pensja = newEmployee.zmianaPensji(zmianaPensji);
       
      }

Mam nadzieje, że chodziło o taką zmianę.

0
Swr napisał(a):

Co do errorów... no jest napisane, że nie może znaleźć "msg", a to dlatego, że w mainie(i w pewnej innej metodzie) nie masz takiej zmiennej... wrzuć tam z góry zdefiniowany String "TO JEST TESTOWY STRING MSG".
Zresztą w tej chwili nie ma sensu main :P ale błędy są przez to

Wiem, że nie ma sensu, bo nie bardzo wiedziałam jak to napisać :(
showInfo(Employee) też chyba jest źle. To znaczy nie wyświetla wyników, czyli danych pracownika. Nie bardzo wiem jak to zmienić.

0

Wstawiaj kod w znaczniki < code=java > ...

 (bez spacji!).
```java
   public double zmianaPensji(){
      zmianaPensji = pensja+((zmianaPensji/100.0)*pensja);
      return zmianaPensji;
   }

Ta funkcja zupełnie nie spełnia warunków zadania - nie zmienia pensji, nie otrzymuje argumentów. Sformułowanie zadania nie precyzuje czy ta funkcja ma cokolwiek zwracać. Jedna z możliwych wersji (nic nie zwraca):

   public void zmianaPensji(double procentZmiany){
      pensja+=(procentZmiany/100.0)*pensja;
   }

Logiczne są tez dwa inne rozwiązania: funkcja zmianaPensji zwraca nową pensję lub kwotową zmianę pensji.

0

Już z tą pensją i jej zmianą poprawiłam parę postów wyżej.
Więc mam nadzieje, że zadanie 1 jest już dobrze. Za to nie wiem jak poprawić zadanie 2.

0

w klasie Employye jeżeli masz publiczne pola to po co piszesz metody je zwracające? albo zmień pola na prywatne i napisz metody je ustawiające albo po prostu odwołuj się do nich (co jest chyba nie koniecznie poprawne )

0
 
 
 public class Employee {
 	
	private String imie;
	private String nazwisko;
	private int wiek;
	private double pensja;
	
	// ................................. ATRYBUTY PRACOWNIKOW
 
    public Employee (){
    }
    
	public String podajImie(){
    	return imie;
	}
	
	public String podajNazwisko(){
    	return nazwisko;
	}
	
	public int podajWiek(){
   		return wiek;
	}
	
   public double podajPensje(){
      return pensja;
   }
   
   	// ..................... OPIS PRACOWNIKA I ZMIANA PENSJI O DANY PROCENT
   
   public String toString(){
      return imie + " " + nazwisko + ", wiek: " + wiek + " lat, pensja: " + pensja;

   }
   
   public double zmianaPensji(double zmianaPensji){
      pensja = pensja+((zmianaPensji/100.0)*pensja);
      return pensja;
   }
   
   public Employee(String imie, String nazwisko, int wiek, double pensja){
      this.imie = imie;
      this.nazwisko = nazwisko;
      this.wiek = wiek;
      this.pensja = pensja;
   }
   
  }
 

Coś takiego? (łącząc wszystkie poprawki z postów wyżej)

0

Więc pozostaje jeszcze zadanie drugie. Rozumiem, że ten fragment jest dobrze:

 import javax.swing.JOptionPane;
 
 public class Emp {
 	
   public Employee defEmp(String msg){
 	  
      Employee newEmployee = new Employee();
      
      String imie = JOptionPane.showInputDialog("Podaj imię pracownika");
      	if (imie == null){
      	 	imie = "";
      	 	}
      	newEmployee.imie = imie;                    
 	  
      String nazwisko = JOptionPane.showInputDialog("Podaj nazwisko pracownika");
      	if (nazwisko == null){
      	  	nazwisko ="";
    	 	}
      	newEmployee.nazwisko = nazwisko;                    
 	  	  
      String w = JOptionPane.showInputDialog("Podaj wiek pracownika");
      	if(w == null){
           w = "";
          }
      	int wiek = Integer.parseInt(w);
      	newEmployee.wiek = wiek;   
          
          
      String p = JOptionPane.showInputDialog("Podaj pensje pracownika");
     	 if(p == null){
      		p = "";
      		}
     	 double pensja = Double.parseDouble(p);
      	 newEmployee.pensja = pensja;
  } 

  public static void changeSalary(Employee){
 
  	Employee newEmployee = new Employee();
  		
      String zmiana = JOptionPane.showInputDialog("Podaj o ile zmienić pensję");
       double zmianaPensji = Double.parseDouble(zmiana);
       newEmployee.pensja = newEmployee.zmianaPensji(zmianaPensji);
       
      }

Ale dalej nie wiem jak poprawić showInfo(Employee) by dobrze zwracało dane pracownika i jak napisać już klasę main, by zadanie w ogóle działało.

0

Jeżeli chcesz wyswietlic informacje na konsoli, to:

void showInfo(Employee emp)
{
    System.out.println(emp);
}
0

Nie wiem czy idę w dobrym kierunku, ale zmieniłam w klasie Employee:

   public String toString(String wynik){
      wynik = imie + " " + nazwisko + ", wiek: " + wiek + " lat, pensja: " + pensja;
      return wynik;
 
   } 

i potem mam

  import javax.swing.JOptionPane;
 
 public class Emp {
 	
   public Employee defEmp(String msg){
 	  
      Employee newEmployee = new Employee();
      
      String imie = JOptionPane.showInputDialog("Podaj imię pracownika");
      	if (imie == null){
      	 	imie = "";
      	 	}
      	newEmployee.imie = imie;                    
 	  
      String nazwisko = JOptionPane.showInputDialog("Podaj nazwisko pracownika");
      	if (nazwisko == null){
      	  	nazwisko ="";
    	 	}
      	newEmployee.nazwisko = nazwisko;                    
 	  	  
      String w = JOptionPane.showInputDialog("Podaj wiek pracownika");
      	if(w == null){
           w = "";
          }
      	int wiek = Integer.parseInt(w);
      	newEmployee.wiek = wiek;   
          
          
      String p = JOptionPane.showInputDialog("Podaj pensje pracownika");
     	 if(p == null){
      		p = "";
      		}
     	 double pensja = Double.parseDouble(p);
      	 newEmployee.pensja = pensja;
  }
  
   public static void changeSalary(Employee Emp){
 
  	Employee newEmployee = new Employee();
  		
      String zmiana = JOptionPane.showInputDialog("Podaj o ile zmienić pensję");
       double zmianaPensji = Double.parseDouble(zmiana);
       newEmployee.pensja = newEmployee.zmianaPensji(zmianaPensji);
       JOptionPane.showMessageDialog(null, newEmployee.wynik);
      }
      
  public static void showInfo(Employee emp){
		Employee newEmployee = new Employee();
    	JOptionPane.showMessageDialog(null, newEmployee.wynik);
	}
 }

nawet nie wiem czy to działa bo pojawia się błąd:

Emp.java:35: error: missing return statement
  }
0

o_O to dopisz łaskawie w

public Employee defEmp(String msg){

na samym końcu

return newEmployee;
0

Poprawione.
W metodzie:

   public static void changeSalary(Employee Emp){

też zwracać newEmployee?

i tutaj

    
public static void showInfo(Employee Emp){
Employee newEmployee = new Employee();
	} 

myślałam nad czymś takim:

    public static void showInfo(Employee Emp){
   	 Employee newEmployee = new Employee();
     wynik = newEmployee.wynik;
     return wynik;
	} 

ale chyba to nie jest poprawne.

0

tworzenie nowych obiektow Employee nie jest rozwiązaniem. Operuj na przekazanym do metody obiekcie

public static void changeSalary(Employee emp){

przekazujesz tutaj pracownika jako emp to i na nim operuj jak musisz.
dla showInfo np.

public static void showInfo(Employee emp){
   JOptionPane.showMessageDialog( null, emp.toString());
}

to samo dotyczy changeSalary

0

Jak metoda jest void (z angielska pozbawiony, nie dający wyników, nieważny) to taka funkcja z założenia nic nie zwraca w związku z czym nie powinno być w niej parametru return ani ona nic nie zwraca....

0
 	public static void showInfo(Employee emp){
  		JOptionPane.showMessageDialog( null, emp.toString());
	}
	 
   public static void changeSalary(Employee emp){
 
    String zmiana = JOptionPane.showInputDialog("Podaj o ile zmienić pensję");
       double zmianaPensji = Double.parseDouble(zmiana);
       emp.pensja = emp.zmianaPensji(zmianaPensji);
  
       JOptionPane.showMessageDialog( null, emp.toString());
       
      }

Poprawione.

W klasie main już nie odwoływać się do klasy Employee?
Jak więc mogłabym teraz odwołać się do public Employee defEmp(String msg) tak by po kolei zadano pytania w oknach dialogowych a następnie wyświetliło showInfo i potem po zmienie dane changeSalary?

W zadaniu napisane jest też by zadbać o obsługę błędów. Czy to co dałam w Employee defEmp(String msg) wystarczy?
To znaczy uwzględniłam tam, że pewne pola mogą być puste. Nie jestem pewna czy jedno puste pole od razu powinno wyświetlać błąd w programie czy dopiero jeśli wszystkie dane nie zostaną podane?

0

jeżeli chodzi o pierwsze to nie wiem bo nie mogę i tak zrozumieć co chciałeś osiągnąć.

Natomiast jeżeli chodzi o drugie to się zastanów jak np. poprosisz użytkownika żeby podał o ile ma wzrosnąć pensja a on Ci wpisze "trolololo" to co się stanie? i odpowiadając sobie na to pytanie odpowiesz sobie czy masz zrobioną obsługę błędów

0

W pierwszym chciałam by najpierw po kolei pytało o dane użytkownika (czyli wszystko z public Employee defEmp(String msg)), potem wyświetli w oknie dialogowym:
dane użytkownika (podane wcześniej)
o ile zmieniono pensje
i dane po zmianie.
Nie wiem tylko czy da się tak odwołać do tych metod by wszystkie dane wyświetlały się w jednym oknie.

Co do sprawdzania czy argument jest liczbą to znalazłam coś takiego (wstawiłam dla przykładu wiek):

try { 
    
   int wiek = Integer.parseInt(w);
   newEmployee.wiek = wiek;    
   } 

catch (NumberFormatException e) { 
   JOptionPane.showMessageDialog( null, "Wiek musi byc liczba. Wprowadz poprawne dane");
}  

NumberFormatException e < niestety nie mogę znaleźć wyjaśnienia co to oznacza.
(nigdy wcześniej nie stosowałam tej metody z try i catch)
Tylko wtedy nie bardzo wiem jak zrobić pętle by znów zapytało o wiek.

0

serio? nie wpisalas w google "try catch java" i nie przeczytalas nic o tym? Dodatkowo czy NumberFormatException samo w sobie nie mówi wiele ?

Integer pobranaLiczba = null;
while(poblanaLiczba == null)
{
 //blok try catch w ktorym robisz: pobranaLiczba = new Integer(w);
}
0
import javax.swing.JOptionPane;
 
 class Main {
	public static void main(String[] args) {
		
		Employee emp1 = EMP.defEmp("Pracownik 1");	
		EMP.showInfo(emp1);
		EMP.changeSalary(emp1);
		EMP.showInfo(emp1);
	
		Employee emp2 = EMP.defEmp("Pracownik 2");	
		EMP.showInfo(emp2);
		EMP.changeSalary(emp2);
		EMP.showInfo(emp2);

		Employee emp3 = EMP.defEmp("Pracownik 3");
		EMP.showInfo(emp3);
		EMP.changeSalary(emp3);
		EMP.showInfo(emp3);
	}
}
 
 
 class Employee {
 
     String imie;
     String nazwisko;
     int wiek;
     double pensja;
 
    public Employee (){
    }

	public Employee(String im, String naz, int w, double pen){
      imie = im;
      nazwisko = naz;
      wiek = w;
      pensja = pen;
   }
 
   public String toString(){
      return imie + " " + nazwisko + ", wiek: " + wiek + " lat, pensja: " + pensja;
   }
 
   public void zmianaPensji(double zmianaPensji){
      pensja = pensja+((zmianaPensji/100.0)*pensja);
   }
}

  class EMP{
  	
	public EMP(){
	}
	
   public static Employee defEmp(String msg){
   
 	  String w = null;
 	  String p = null;
 	  String imie = "";
 	  String nazwisko = "";
      	
    while(imie == ""){  
      
      imie = JOptionPane.showInputDialog("Podaj imię pracownika");
      	if (imie == ""){
      		imie = "";
      	 	JOptionPane.showMessageDialog(null, "Wprowadz dane!");
      	 	}
      	}                 
 	  
 	  
 	 while(nazwisko == ""){
 	 	 
      nazwisko = JOptionPane.showInputDialog("Podaj nazwisko pracownika");
      	if (nazwisko == ""){
      		nazwisko = "";
      	  	JOptionPane.showMessageDialog(null, "Wprowadz dane!");
    	 	}
    	 }
    	 	                  
 	  	  
 	while(w == null){  	  
 	  	  
       w = JOptionPane.showInputDialog("Podaj wiek pracownika");

     	 try { 
      	 int wiek = Integer.parseInt(w);
      	 
      	 	if(wiek < 0){
      	 		JOptionPane.showMessageDialog(null, "Wiek nie moze byc ujemny!");
      	 		w = null;
      	 	}
         }
      	
      	 catch (NumberFormatException e) {
      	 	w = null; 
   		 JOptionPane.showMessageDialog(null, "Wiek musi byc liczba. Wprowadz poprawne dane");
		 }    
      	
     } 
          
     while(p == null){     
         p = JOptionPane.showInputDialog("Podaj pensje pracownika");
     	 
     	 try {
     	 double pensja = Double.parseDouble(p);
     	 
     	 if(pensja < 0){
      	 		JOptionPane.showMessageDialog(null, "Pensja nie moze byc ujemna!");
      	 		p = null;
      	 		}
         }
         
   		 catch (NumberFormatException e) {
      	 p = null; 
   		 JOptionPane.showMessageDialog(null, "Pensja musi byc liczba. Wprowadz poprawne dane");
		 }   
		 
		} 
		
		Employee Pracownik = new Employee(imie, nazwisko, wiek, pensja);
		return Pracownik;
		}
	
	public static void showInfo(Employee emp){
  		JOptionPane.showMessageDialog(null, emp.toString(), "Message", JOptionPane.INFORMATION_MESSAGE);
  		return;
	}
	
	 
   public static void changeSalary(Employee emp){
   	
 	String zmiana = null;	
 	while(zmiana == null){
    zmiana = JOptionPane.showInputDialog("Podaj o ile zmienić pensję");
    try {
       double zmianaPensji = Double.parseDouble(zmiana);
       }
 	catch (NumberFormatException e) {
       zmiana = null; 
   	   JOptionPane.showMessageDialog( null, "Wiek musi byc liczba. Wprowadz poprawne dane");
	   } 
	}
       
       emp.zmianaPensji(zmiana);

      }
 }

Tak wygląda mój program.
Prosiłabym o sprawdzenie.

Jest taki problem:

121: error: cannot find symbol
		Employee Pracownik = new Employee(imie, nazwisko, wiek, pensja);
											^

Nie bardzo wiem dlaczego, skoro dałam w kodzie:

int wiek = Integer.parseInt(w);

dodanie znaczników <code> i <code class="java"> - fp

0

Zacznij od przeczytania jakiegoś podręcznika, Ty nie znasz zupełnych podstaw.

          try { 
           int wiek = Integer.parseInt(w);
 
               if(wiek < 0){
                   JOptionPane.showMessageDialog(null, "Wiek nie moze byc ujemny!");
                   w = null;
               }
           //tutaj zmienna wiek już nie jest znana

Zmienna zadeklarowana po otwierającym nawiasie klamrowym { przestaje istnieć po zamykającym nawiasie klamrowym }

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