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

Czemu moje metody są martwe, np. nie mogę wprowadzić danych po wywyołaniu metody dodajKsiazke() ?

Object Storage Arubacloud
0 głosów
330 wizyt
pytanie zadane 2 sierpnia 2018 w Java przez Atarii Użytkownik (770 p.)

public class Ksiazka {
	
	int id;
	String tytul;
	String nazwiskoAutora;
	int rok;
	String kategorie;
	boolean czyWypozyczona;
	int liczbaWypozyczen;
	
	public Ksiazka(int id,String tytul,String nazwiskoAutora,int rok,String kategorie,boolean czyWypozyczona,int liczbaWypozyczen){
		this.id=id;
		this.tytul=tytul;
		this.nazwiskoAutora=nazwiskoAutora;
		this.kategorie=kategorie;
		this.rok=rok;
		this.czyWypozyczona=czyWypozyczona;
		this.liczbaWypozyczen=liczbaWypozyczen;
	}
	
	public static void main(){
		Biblioteka b= new Biblioteka();
		b.dodajKsiazke();
		b.edytujKsiazke(0);
	}
}





import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.util.Scanner;
import java.util.StringJoiner;

public class Biblioteka {
	Ksiazka[] ksiazki=new Ksiazka[1000];
	int ileKsiazek;

	public Biblioteka(){
		ileKsiazek=0;
	}
	
	void listaKsiazek(){
		for(int i=0; i<ileKsiazek; i++){
			System.out.println(ksiazki[i].id+" ");
			
			String tab[] = ksiazki[i].nazwiskoAutora.split(" ");
			String a="";
			for(int k=0; k<tab.length-1; k++){
				a+=tab[k].charAt(0)+".";
			}
			a+=tab[tab.length-1];
			
			System.out.print(ksiazki[i].tytul);
			if(ksiazki[i].czyWypozyczona){
				System.out.print(" TAK ");
			}
			else{
				System.out.print(" NIE ");
			}
		}
	}

	void listaKsiazekFull(){
		for(int i=0; i<ileKsiazek; i++){
			infoKsiazka(i);
		}
	}

	void dodajKsiazke(){
		Scanner in = new Scanner(System.in);
		if(ileKsiazek<1000){
		int id=ileKsiazek;
		System.out.println("Podaj tytuł ");
		String tytul=in.nextLine();
		System.out.println("Podaj nazwisko autora ");
		String nazwiskoAutora=in.nextLine();
		int rok=0;
		do{
		System.out.println("Podaj rok 1700-2012");
	    rok=in.nextInt();
		}while(rok>2012 || rok<1700);
		
		System.out.println("Podaj kategorie ");
		String kategorie=in.nextLine();
		boolean czyWypozyczona=false;
		int liczbaWypozyczen=0;
		ksiazki[ileKsiazek]=new Ksiazka(id,tytul,nazwiskoAutora,rok,kategorie,czyWypozyczona,liczbaWypozyczen);
		ileKsiazek++;
		}
		else{
			System.out.println("Za dużo książek");
		}
	}
	
	void infoKsiazka(int i){
		System.out.println(ksiazki[i].id+" "+ksiazki[i].nazwiskoAutora+" "+ksiazki[i].tytul+" "+ksiazki[i].rok+" "+ksiazki[i].kategorie+
				" "+ksiazki[i].liczbaWypozyczen+" ");
		if(ksiazki[i].czyWypozyczona){
			System.out.print("TAK");
		}
		else{
			System.out.print("NIE");
		}
	}
	

	void edytujKsiazke(int i){
		if(ksiazki[i]!=null){
			infoKsiazka(i);
		
		System.out.println("wybierz co chcesz zmienić: ");
		System.out.println("1.nazwiskoAutora");
		System.out.println("2.tytuł");
		System.out.println("3.rok");
		System.out.println("4.kategorie");
		
		Scanner in= new Scanner(System.in);
		int wybor=in.nextInt();
		switch(wybor){
		case 1:
			ksiazki[i].nazwiskoAutora=in.nextLine();
			break;
		case 2:
			ksiazki[i].tytul=in.nextLine();
			break;
		case 3:
			int rok=0;
			do{
				System.out.println("Podaj rok 1700-2012");
			    rok=in.nextInt();
				}while(rok>2012 || rok<1700);
			ksiazki[i].rok=rok;
			break;
		case 4:
			ksiazki[i].kategorie=in.nextLine();
			break;
		default:
			System.out.println("Nie ma takiej opcji");
			break;
		}
	   }
	}

	void wypozycz(int i){
		if(ksiazki[i]!=null){
			ksiazki[i].czyWypozyczona=true;
		}
	}
	
	void oddaj(int i){
		if(ksiazki[i]!=null)
		ksiazki[i].czyWypozyczona=false;
		ksiazki[i].liczbaWypozyczen++;
	}

	void wyszukaj(){
		System.out.println("Na jakiej podstawie chcesz wyszukać książkę? ");
		System.out.println("1. nazwisko autora");
		System.out.println("2. tytuł");
		System.out.println("3. kategorii tematycznej");
		
		Scanner in = new Scanner(System.in);
		int i=in.nextInt();
		
		switch(i){
		case 1:
			System.out.println("Podaj nazwisko autora");
			 String nazwisko=in.nextLine();
			
			 for(int j=0; j<ileKsiazek; j++){
				 if(nazwisko.length()<=ksiazki[j].nazwiskoAutora.length()){
					if(ksiazki[j].nazwiskoAutora.startsWith(nazwisko)){
						infoKsiazka(j);
					}
				 }
			 }
			 
			break;
		case 2:
			System.out.println("Podaj tytuł książki");
			 String tytul=in.nextLine();
			
			 for(int j=0; j<ileKsiazek; j++){
				 if(tytul.length()<=ksiazki[j].tytul.length()){
					if(ksiazki[j].tytul.startsWith(tytul)){
						infoKsiazka(j);
					}
				 }
			 }
			
			break;
		case 3:
			System.out.println("Podaj kategorie");
			 String kategoria=in.nextLine();
			
			 for(int j=0; j<ileKsiazek; j++){

					if(ksiazki[j].kategorie.equals(kategoria)){
						infoKsiazka(j);
					}
				 
			 }
			break;
		default:
			System.out.println("Nie ma takiej opcji");
			break;
		}
		
	}
	
	void funkcjeDodatkowe(){
		Scanner in = new Scanner(System.in);
		System.out.println("1.Wyświetlanie  liczby  wszystkich  książek,  liczby  obecnie  wypożyczonych  orazcałkowitej liczby wypożyczeń.");
		System.out.println("2.Wyświetlanie  5  najczęściej  wypożyczanych  egzemplarzy  książek  w  formacie skróconym");
		System.out.println("3.Wyświetlanie 5 najbardziej poczytnych książek z każdej kategorii tematyczne");
		System.out.println("4.Wyświetlanie 5 najbardziej poczytnych autorów ");
		int wybor=in.nextInt();
		
		switch(wybor){
		case 1:
			 int obecnieWypoz=0;
			 int liczbaWypoz=0;
			 for(int i=0; i<ileKsiazek; i++){
				 if(ksiazki[i].czyWypozyczona)obecnieWypoz++;
				 liczbaWypoz+=ksiazki[i].liczbaWypozyczen;
			 }
			 System.out.println("Liczba ksiazek "+ileKsiazek);
			 System.out.println("obecnie wyp "+obecnieWypoz);
			 System.out.println("liczba wypoz "+liczbaWypoz);
			 
			 
			break;
		case 2:
 
			
			break;
		case 3:
			 
			break;
		case 4:
			break;
		default:
			System.out.println("Nie ma takiej opcji");
			break;
		}
	}
	
	
	

}

 

 

http://skinderowicz.pl/static/pp/opis_prog_zal.pdf tutaj treść zadania obecnie jestem na 8 zadaniu i podpunkcie b

 

Pomoże mi ktoś to ogarnąć wskazując jakie popełniłem błędy?

1 odpowiedź

+2 głosów
odpowiedź 2 sierpnia 2018 przez Wiciorny Ekspert (270,110 p.)
wybrane 2 sierpnia 2018 przez Atarii
 
Najlepsza

Nie rozumiem co rozumiesz przez martwe metody?

Po pierwsze: nie uyżywasz wszystkich, po drugie one należą do obiektu bo nie są statyczne- są metodami instancji....

po trzecie metoda main powinna byc nie co inna 

  public static void main(String[] args) {
        Biblioteka b= new Biblioteka();
        b.dodajKsiazke();
        b.edytujKsiazke(0);
    }

potworny kod, strasznie niepotrzebne funkcje, strasznie dużo zbędnego kodu, słabej implementacji. Wiem że to nauka dopiero ale bardzo ciężko zrozumieć ;] 

też jeśli robisz coś takiego 

int wybor=in.nextInt();

po tej operacji jak w switch  robisz 

ksiazki[i].nazwiskoAutora=in.nextLine();

to czytasz pustą linie, bo skaner po wczytaniu INTA JAKO CASE- > zostaje Ci w poprzedniej starej lini ... czyta Ci puste pole więc ... konczy operacje.  

komentarz 2 sierpnia 2018 przez Atarii Użytkownik (770 p.)
Dziękuję, zmodyfikowałem to, nie wiedziałem, że nie mogę używać tego samego strumienia, jeżeli wcześniej podam Inta :( dlatego przeskakiwało mi i nie wypełniało wartością.

 

Co do kodu, jak mogę poprawić jego czytelność, jak ty byś to rozwiązał?

Jak zrobiłbyś przykład b) c) d) z zadania 8mego, użyć w jakiś sposób kolekcji i HashMapy, czy jak?
komentarz 2 sierpnia 2018 przez Wiciorny Ekspert (270,110 p.)

nie wiedziałem, że nie mogę używać tego samego strumienia, jeżeli wcześniej podam Inta 

Możesz, ale po wczytaniu inta - kursor zostaje w tej samej lini- więc jeśli po liczbie nie ma tekstu, to wczytuje puste znaki

 powinieneś

int wybor=in.nextInt();

wczytając liczbe  jeśli po niej nie ma stringa, przenieść  Scanner do nastepnej lini  

in.nextLine();

 A potem  juz dalej 

ksiazki[i].nazwiskoAutora=in.nextLine();

Co do kodu, trudno powiedzieć  ja bym tutaj wgl zaimplementował Interfejs, zrobił to  na 1 klasie maksymalnie, zmniejszył ilość  metod do minimum, użył funkcjonalności JAVA-8 strumieni danych, no ... to jest widać kod początkującego więc za dużo by pisać  wiele niepotrzebnych pętli, wiele operacji   switch/case też niepotrzebnych -> do while którego się juz nie używa w javie nawet 

komentarz 2 sierpnia 2018 przez Atarii Użytkownik (770 p.)

@Wiciorny,
 Ja to rozwiązałem mniej ekonomicznie, stworzyłem nowy obiekt klasy Scanner.

W sumie, to dziwne zachowanie, pierwszy raz się z takim czymś spotykam, że po wpisaniu inta kursor zostaje w tej samej lini

komentarz 2 sierpnia 2018 przez Atarii Użytkownik (770 p.)

@Wiciorny,

Interfejs powinien tutaj być użyty, ale z mniejszą ilością metod, tak, a w klasie tylko je zaimplementować?

komentarz 2 sierpnia 2018 przez Wiciorny Ekspert (270,110 p.)

@Atarii, bo jak czegoś używasz -> to czytaj dokumentacje i się ucz :

public int nextInt()

Scans the next token of the input as an int.

An invocation of this method of the form nextInt() behaves in exactly the same way as the invocation nextInt(radix), where radix is the default radix of this scanner.

https://christprogramming.wordpress.com/2014/01/30/java-common-mistakes-1/

Nie nterfejs powinien tutaj być użyty, ale z mniejszą ilością metod, tak, a w klasie tylko je zaimplementować? 

nie ma czegoś takiego jakMUSI BYĆ nie musi, no   nie masz na tyle wiedzy i wiele nie widzisz, ja tutaj wgl zastosowałbym rzeczy o których pojęcia nie masz : np SOLID / WZORCE PROJEKTOWE  np. factory pattern  rób jak Ci wygodnie z latami wrócisz może do starych projektów to ogarniesz.

ucz się pisać w javie 8/9 najlepiej korzystaj z tych FEATERÓW  

komentarz 3 sierpnia 2018 przez Atarii Użytkownik (770 p.)

@Wiciorny,
 Naprawdę cenię pana rady, na razie to dla mnie czarna magia to co jest napisane, ale kiedyś wrócę do tego komentarza. Obiecałem sobie do końca roku zostać Juniorem Javy i pracować podczas studiów zaocznych, dlatego chcę wycisnąć ze swojej nauki jak najwięcej.

komentarz 3 sierpnia 2018 przez Wiciorny Ekspert (270,110 p.)
łooo panie :D w rok Junior, powodzenia. :) Ja dopiero po 2-3 latach pracy i 600 godzin na gicie w domu na juniora poszedłem a i tak trzeba było staże... POWODZENIA
komentarz 3 sierpnia 2018 przez Atarii Użytkownik (770 p.)

@Wiciorny,  Aż tak źle z tym jest? Myślałem, po filmach na YT, że nie trzeba mieć jakiś wielkich kwalifikacji, żeby iść na juniora jeżeli jest się studentem i że firmy przede wszystkim nas przyuczają :D Ja wciąż wierzę w siebie i że mi się uda

Podobne pytania

–1 głos
2 odpowiedzi 161 wizyt
pytanie zadane 16 stycznia 2018 w C i C++ przez Hawkeye Początkujący (360 p.)
+1 głos
1 odpowiedź 5,594 wizyt
0 głosów
2 odpowiedzi 207 wizyt
pytanie zadane 29 stycznia 2018 w Sprzęt komputerowy przez Radek1992 Nowicjusz (170 p.)

92,568 zapytań

141,422 odpowiedzi

319,638 komentarzy

61,957 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...