Wyszukiwanie pracownika - program

0

Witam serdecznie

Mam mały problem ;-) W ramach zajęć ze "sztucznej inteligencji" muszę wykonać program wyszukujący pracownika z bazy wg kryteriów: np. wiek, zawód, wykształcenie itp. fajnie gdyby można też dodawać pracownika do bazy samodzielnie.

Myślałem o tym i baza może byc stworzona na zasadzie pliku tekstowego lub tablic. Kazano też wprowadzić jakiś mechanizm sztucznej inteligencji(cokolwiek) np wyświetlanie wiadomości Pan X musi nauczyc sie j. angielskiego. Proszę o pomoc :) Nie musicie podawać całego programu ale chociaż jakieś wskazówki, fragmenty kodu itp :) będę wdzięczny

PS. Jestem cienki w Javie więc poproszę o odpowiedzi typu "Kali jeść" :-)

0

Sam jestem bardzo początkujący, jednak postaram się jakoś pomóc koledze. Spodziewam się, że zostanie mi zwrócona uwaga, ale im więcej będę pracować tym prędzej będę odpowiadać bardziej z sensem. Problem kolegi wydaje się oczywisty, więc postaram się wypisać jakieś podpowiedzi.

Najpierw zdecyduj gdzie chcesz przechowywać dane twoich pracowników. Z początku możesz sobie przechowywać jakąś tablicę łańcuchów, lub zadeklarować stan obiektów ręcznie, jednak warto skorzystać z innych dostępnych możliwości takich jak zapis/odczyt z pliku lub bazy danych. Wszystko zależy od wymagań twojego zadania.

Najprostsze rozwiązanie to np. zwykły plik *.txt
Uzupełnij sobie plik kilkoma wstępnymi danymi np.

imie;nazwisko;wiek;zawod;wyksztalcenie;jezyki
Jan;Kos;21;programista;średnie;angielski
i kilku innych.

Kiedyś ucząc się podstaw programowania w Javie był przedstawiony przykład twojego problemu.

Powiedzmy, że pobrałeś powyższy łańcuch z pliku i za pomocą StringTokenizer rozdzielasz kolejne dane, które możesz przekazać do konstruktora utworzonej przez ciebie klasy np. Pracownik:

//Konstruktor
Pracownik(String imie, String nazwisko, int wiek, String zawod, String wyksztalcenie, String jezyk)
{
// Ciało konstruktora
}

Kiedy utworzysz obiekt nowego użytkownika przekazując do konstruktora pobrane dane, wystarczy, że napiszesz kilka metod, które będą wykonywać dla Ciebie pożądane operacje i zwracać równie pożądane odpowiedzi.

np.

pobierzImie()
{
  return imie;
}

Przykład sprawdzenia czy pracownik zna jakis jezyk. Jeżeli nie to niech zwróci informację o tym, że musi się jeszcze pouczyć.

public boolean znaJakisJezyk()
{
  if(this.getLanguage().equalsIgnoreCase("brak"))
  return false;
  //else niech zwróci true i tyle
}

Nic więcej ci chyba nie potrzeba, chyba, że chcesz np. zastosować dziedziczenie. Wtedy możesz stworzyć osobne klasy, dziedziczące klasę pracownik. (np. pracownik, prezes, sekretarka i tak dalej).

Twoje zadanko jest proste, więc nie powinieneś mieć większych problemów z napisaniem takiego programu.

W razie kolejnych pytań wal.

Masz poniżej ci wkleje kod jaki napisałem w 5 minut.

Person.java

package employers;

public abstract class Person {
	
	String name = "";
	public Person (String name)
	{
		this.name = name;
	}
	public String getName()
	{
		return name;
	}

}

Worker.java

package employers;

import employers.Person;

public class Worker extends Person{
private String job = "";
private int age = 0;
private String language = "";
private double earnings = 0;


	public Worker(String name, String job, int age, String language, double earnings) {
		super(name);
		this.setJob(job);
		this.setAge(age);
		this.setLanguage(language);
		this.setEarnings(earnings);
		
	}

	public void setJob(String job) {
		this.job = job;
	}

	public String getJob() {
		return job;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getAge() {
		return age;
	}

	public void setLanguage(String language) {
		this.language = language;
	}

	public String getLanguage() {
		return language;
	}

	public void setEarnings(double earnings) {
		this.earnings = earnings;
	}

	public double getEarnings() {
		return earnings;
	}

}

WorkerTest.java

package employers;

import java.util.ArrayList;


public class WorkerTest {

	public static void main(String[] args)
	{
		Language lan = new Language();
		ArrayList<Worker> pracownik = new ArrayList<Worker>();
		pracownik.add(new Worker("Michał", "programista", 21, "English", 1500));
		pracownik.add(new Worker("Marcin", "leń", 21, "brak", 1500));
		pracownik.add(new Worker("Michał", "HelpDesk", 21, "Deutch", 1500));
		
		for(int i = 0; i < pracownik.size(); i++)
		{
			String mess = "Pracownik: " + ((Person) pracownik.get(i)).getName() + " Zawód: " + pracownik.get(i).getJob() +" Wiek:" + pracownik.get(i).getAge();
			
			if(lan.isKnowAnyLanguage(pracownik.get(i)))
			mess = mess + " Jezyk: " + pracownik.get(i).getLanguage() + ".";
			else
			mess = mess + " Nie zna zadnego obcego jezyka i musi sie pouczyć.";
			
			System.out.println(mess);
		}
	}
}

Language.java

package employers;


public class Language {
	
	public boolean isKnowAnyLanguage(Worker pracownik)
	{
		if(pracownik.getLanguage().equalsIgnoreCase("brak"))
		return false;
		else return true;
		
	}

	

}

Klasa Language to typowa klasa, w której sprawdzamy czy nasz pracownik zna jakiś język. Prosty przykład, jak rozwinąć nasz program.

Program chwilówka, więc, mam nadzieję, że nie zostanę zbesztany z błotem. Kolega jest świeży, więc nie chciałem komplikować niczego.

0

Dzięki za pomoc :) sry, że odpisuję tak późno. Próbuje odpalić programik i wyświetla mi tych 3 pracowników + info o języku...

Potrzebowałbym wyboru wieku, języka itp :( i żeby pokazywał mi tylko osoby spełniające te kryteria.... Czy dałoby rade napisać gotowy kod, który będę mógł edytować i rozwijać?

To jest zaliczenie do szkoły a ja jestem kompletnie zielony z Javy :( cóż grafik to grafik a nie programmer

0

Jeśli chcesz oprzeć to na bazie danych, musisz się zaznajomić z jdbc, google Ci powie, które ścieżki obrać, bo zakładam, że jakąś podstawową wiedzę na temat sql znasz, a ona wystarczy do tego zadania.

Generalnie masz do wyboru - baza danych, xml, serializacja, pliki tekstowe, kolejność nie przypadkowa.

Jeśli dobrze pokombinujesz, możesz dynamicznie regulować który sposób przechowywania danych użyjesz, możesz na przykład pobrać dane z bazy, przetworzyć je, zapisać z powrotem, a przy okazji zapisać je w xml.

Chcesz żeby ten program był łatwy w utrzymaniu, więc nie jest to takie trywialne zadanie dla początkującego jakby się mogło wydawac, bo trzeba dobrze przemyśleć jego projekt. To jest ciekawe zadanie.

Mam sugestię, jeśli nie wiesz dokładnie jaki będzie rodzaj przechowywania danych, cały kod na ten temat wyrzuć do osobnych klas, niech to będzie taki zalążek, coś na wzór wzorca dao. W każdym razie na potrzeby testowe będziesz mógł w takich obiektach utworzyć te osoby na sztywno.

Na tę chwilę, wiesz że musisz wyszukiwać osoby na podstawie kilku kryteriów, wiek, znajomość języków itd, naturalną rzeczą jest, że kryteria będą się zwiększać...

Moim skromnym zdaniem pomysł z dziedziczeniem i na sztywno w kodzie klasy ustalaniem właściwości danej osoby nie jest dobrym pomysłem, wynika to z specyfiki takiego programu.

Na początek utwórz sobie klasę reprezentującą każda osobę w systemie, olej abstrakcję i dziedziczenie, posłuż się kompozycją.


  public class Person {
           private long id;
           private String name;
           // i inne właściwości, które uważasz za wspólne dla wszystkich osób
           //oczywiście gettery i settery dla tego wszystkiego.

           /**to mógłby być typ wyliczeniowy, ale na potrzeby dynamicznej możliwości
            *dodawania nowych typów będzie to zwykła klasa
            */
           private PersonType type;

           /**
            *ten obiekt będzie przechowywał inne właściwości na temat danej osoby
            */
           private PersonDetails details;



           /**
            *metody z klasy bazowej obiekt, jak choćby implementacja toString(),
            *która może przydać się do testowania
            *zapoznaj się z klasą Object, generalnie uważam, że naukę Java, trzeba zacząć
            *właśnie od poznania tej klasy
            */
  }

/**
 *Obiekty tej klasy będą służyć do wyszukiwania informacji o danej osobie.
 *Widzę tu singletona ale mogę się mylić, poczytaj o Singleton, łatwy wzorzec projektowy
 * Nazwy metod mówią same za siebie, więc nie musze chyba nic wyjaśniać.
*/
public class Criteria {
        

        private Map<String, String> mapCriteria = new HashMap<String, String>

        private static Criteria instance;
 
        public static Criteria getInstance() {
             if (instance == null) instance = new Criteria();
             return instance;
                  
        }
        public void addCriterium(String name, String value) {
              this.mapCriteria.put(name, value)
        }
        
         public void removeCriterium(String name) {
              this.mapCriteria.remove(name);
         }

         public String getCriterium(String name) {
              return this.mapCriteria.get(name);
         }

         public Map<String, String> getAllCriteria() {
                return this.mapCriteria;
         }

         public void reset() {
              this.mapCriteria = new HashMap<String, String>();
         }

      }


To na razie tyle, muszę spadać, jak byś wybrał to rozwiązanie to pytaj.

Pozdrawiam

0

Dzięki za pomoc :) niestety wydaje się to jak dla mnie zbyt skomplikowane, chciałbym po prostu zaliczyć przedmiot i zapomnieć,

Byłbym baaaaaaaardzo wdzięczny jeśli ktokolwiek zamieściłby tutaj gotowy program. nie musi być skomplikowany, wystarczy imię, nazwisko, wiek, zawód, język. Do tego mała wyszukiwarka i baza nazwisk w txt. Nazwiska mogę dodawać z poziomu txt. Niech pokazuje pasujący wynik + prawie pasujące z komunikatem np. NIE ZNA WYBRANEGO JĘZYKA

Z góry dzięki za pomoc. Jeśli ktoś będzie mial problemy natury graficznej chętnie pomogę w ramach rewanżu. :)

0

Wbrew pozorom mój sposób podejścia do wyszukiwania tych danych nie jest skomplikowany.
Co do sposobu przechowywania danych, olej bazę danych, łatwiej będzie Ci to zrobić na xml lub po prostu z serializacją, która w zupełności wystarczy dla prostego programu.

Ale jeśli oczekujesz większej pomocy, musisz pokazać swoje propozycję, nikt Ci tu gotowca nie da.

Poza tym nie wkręcaj sobie, że jak jesteś grafikiem to nie potrzebujesz umieć programować, to najbardziej mylne przekonanie jakie może zakorzenić się w umyśle grafika.

Jak chcesz być porządnym grafikiem, na pewno będzie chciał poznać technologia flash, flex itd.
Bez znajomości w pełni już obiektowego języka jak ActionScript szału w tych rzeczach nie zrobisz, a wcześniejsze poznanie chociażby takiej Javy dało by Ci dobrą podstawę pod inne języki, zwłaszcza że teraz wiele języków czerpie wręcz garściami z Java.

W dzisiejszych czasach każdy szanujący się grafik jest programistą.

Z tym jest trochę tak, jak w świecie walk MMA, to zawodnicy bjj chętnie chcą się nauczyć walki w stójce niż zawodnicy np. boksu walki w parterze. Tak samo programista bardziej jest chętny nauki grafiki niż odwrotnie. W obu przypadkach lenistwo jest to zgubne.

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