Zadanie, poprawność kodu ;)

0

Witam!
Jako, że jestem nowy, a nigdy nie miałem stycznosci z obiektowością, mam z nia troche problemow.. ^^

Chciałbym się więc spytać czy kod który napisalem poniżej jest poprawny? Czy w mainie mogę deklarować wartosc pola tak jak to zrobiłem czy musze użyc mutatora (settera)?

ZADANIE:
Napisz program sumujący n liczb podawanych przez użytkownika. Ilosc liczb podaje uzytkownik jako pierwsza wartosc. np 5 (3+3+3+3+3=15)

import java.util.Scanner;


public class Zad8 
{
	
	private int wynik;
	private int iloscLiczb;
	private int liczba;
	
	public int obliczWynik()
	{
		for(int i=1; i<=iloscLiczb; i++)
		{
			wynik += liczba;
		}
		return wynik;
	}
	
	
	public static void main(String[] args)
	{
		
		
		Scanner in = new Scanner(System.in);
		Zad8 zad1 = new Zad8();
		
		System.out.println("Podaj ile liczb bedziesz sumował: ");
		zad1.iloscLiczb = in.nextInt();
		
		System.out.println("Podaj jaka liczbe sumować: ");
		zad1.liczba = in.nextInt();
		
		System.out.println("Wynik to: " + zad1.obliczWynik());
		
	}

}
 

pozdrawiam i dziekuje! ;)

0

Pisze post pod postem żeby uwidocznić 2 rózne wersje ;)
Pomyslalem ze mozna to tez zrobic w ten sposób. Który jest bardziej poprawny? a moze zaden nie jest?

import java.util.Scanner;

public class Zad8 
{
	
	private int wynik;
	private int iloscLiczb;
	private int liczba;
	
	public int obliczWynik()
	{
		for(int i=1; i<=iloscLiczb; i++)
		{
			wynik += liczba;
		}
		return wynik;
	}
	
	public void setIloscLiczb()
	{
		Scanner in = new Scanner(System.in);
		System.out.println("Podaj ile liczb bedziesz sumował: ");
		iloscLiczb = in.nextInt();
	}
	
	public void setLiczba()
	{
		Scanner in = new Scanner(System.in);
		System.out.println("Podaj jaka liczbe sumować: ");
		liczba = in.nextInt();
	}
	
	public static void main(String[] args)
	{
		Zad8 zad1 = new Zad8();
		
		zad1.setIloscLiczb();
		zad1.setLiczba();
		System.out.println("Wynik to: " + zad1.obliczWynik());
		
	}

}
0

1 sposob bylby dobry, gdybys uzyl setterow. W drugim sposobie tworzenie 2x scannera mija sie z celem

0
import java.util.Scanner;

public class Zad8 
{
	
	private int wynik;
	private int iloscLiczb;
	private int liczba;
	
	public int obliczWynik()
	{
		for(int i=1; i<=iloscLiczb; i++)
		{
			wynik += liczba;
		}
		return wynik;
	}

	public void setWszystko()
	{
		Scanner in = new Scanner(System.in);
		System.out.println("Podaj ile liczb bedziesz sumował: ");
		iloscLiczb = in.nextInt();
		System.out.println("Podaj jaka liczbe sumować: ");
		liczba = in.nextInt();
	}

	public static void main(String[] args)
	{
		Zad8 zad1 = new Zad8();
		
		zad1.setWszystko();
		System.out.println("Wynik to: " + zad1.obliczWynik());
		
	}

} 

O to chodziło?
Nie byłem pewien, czy moge ustawić 2 pola w jednym setterze. A co do tego to pojawia sie pytanie: jak mam w klasie jakieś pola, których wartosci podaje użytkownik, to wszystkie je wrzucam do jednego settera tam, gdzie jest zadeklarowany obiekt Scanner?

I wgl czemu w javie dzieli się program na tak wiele częsci, nie łatwiej zrobić tego w jednym mainie ?:)
Prosze o wyrozumiałosc i wyjasnienie

pozdrawiam!

0

Obiekt klasy Scanner możesz stworzyć w funkcji main. Z założenia każde pole powinno mieć jeden setter (chyba że nie potrzebujesz go ustawiać poza klasą).

0

Hmm ale wrzucając linijke:

Scanner in = new Scanner(System.in); 

Do metody main pokazuje się błąd przy metodzie settera, że nie można rozpoznać co to jest " in." Jak proponujesz to zrobic?

Czyli.. settery używamy jesli dane pole bedziemy ustawiać poza klasą, a jesli nie bedziemy (tzn bedzie tylko wewnatrz) to nie trzeba ich robić dla danego pola? dobrze rozumiem :)?

#edit
a i tak w ogóle, w setterach można używać takich rzeczy jak system.out.println lub inne operacje INNE niz przypisanie wartosci do pola?
czy raczej przyjelo sie ze to zabronione?

0
import java.util.Scanner;
  
public class Zad8 
{
    private int wynik;
    private int iloscLiczb;
    private int liczba;
 
    public long obliczWynik()
    {
        /*for(int i=1; i<=iloscLiczb; i++)
        {
            wynik += liczba;
        }*/
        wynik = liczba * iloscLiczb;
        return wynik;
    }

    public void pobierzDane()
    {
        Scanner in = new Scanner(System.in);
        System.out.println("Podaj ile liczb bedziesz sumowal: ");
        iloscLiczb = in.nextInt();
        System.out.println("Podaj jaka liczbe sumowac: ");
        liczba = in.nextInt();
    }
 
    public static void main(String[] args)
    {
        Zad8 zad1 = new Zad8();
        zad1.pobierzDane();
        System.out.println("Wynik to: " + zad1.obliczWynik());
    }
}

Wprowadziłem drobne zmiany, metoda obliczWynik zwraca liczbę typu long, a do obliczenia wyniku stosuje mnożenie. Wypróbuj swój program dla liczba = iloscLiczb = 2 000 000 000, to zrozumiesz dlaczego zmiany są wskazane, a jedna z nich jest nawet obowiązkowa.
Setter na pewno nie powinien o nic pytać i niczego nie powinien wyświetlać. Jego przeznaczeniem jest nadanie wartości pewnemu polu w klasie, ewentualnie może sprawdzać czy nadawana jest poprawna wartość, np. w klasie jest pole int wiek i wywołana jest metoda setWiek(-33);. Getter zwraca wartość pola w klasie.
W Twoim zadaniu przykładowe getter i setter mogą wyglądać tak (są zupełnie niepotrzebne):

public void setLiczba();
{
     this.liczba = liczba;
}
public int getLiczba()
{
     return this.liczba;
}

Nie widzę powodu żeby w Twoim kodzie tworzyć obiekt Scanner in w metodzie main(), a korzystać z niego w metodzie pobierzDane(). Gdyby takie coś było konieczne, to są dwa rozwiązania:

  • zmienna in jest polem w klasie, a nie zmienna lokalną,
  • przekazujesz in do metody pobierzDane.
0

Co do mnożenia zamiast pętli z dodawaniem, to wiem, że można było tak zrobić i byłoby znacznie prościej, aczkolwiek chciałem zrobić tak, jak w zadaniu określili z "dodawaniem", żeby załapać składnie javy :) troche dodatkowej nauki nie zaszkodzi hehe ;)

Jesli chodzi o long to racje masz, ale generalnie program miał działać tylko, nawet na najmniejszych liczbach, chodziło o samo rozwiazanie ;) ale dzieki za poprawke!

Ten setter i getter ktory podałes, mógłby być w kodzie który podałem ostatnio ale byłby całkowicie zbędny, tak? bo z tego co rozumiem to przez " this. " dajemy skierowanie do tego pola/tej metody która ma taka samą nazwe, racja?

W takim razie powinienem zrobić osobną metode która ustawi wartość pola liczba i osobna dla iloscLiczb oraz dwie osobne dwie osobne metody które wyświetlą wartość tych ustawionych pól przez gettery które również musze stworzyć? stad powstaje 6 metod w programie, to konieczne? Jak najprościej zrobić ten program obiektowo?

Do tej pory uczyłem sie tylko pascala oraz C, ale jedynie strukturalnie (pisałem w mainie, mało kiedy jakies funkcje itp, generalnie skupienie bylo raczej na podstawowych algorytmach i zrozumieniu kodu niż na obiektowości w jakiś sposob) stąd mam troche problemy przesiaść się na JAVE ;)

pozdrawiam!

0
  1. W Javie mogą istnieć pole i zmienna lokalna o takiej samej nazwie, np. dane. Zapis this.dane jest odwołaniem się do pola w klasie, zapis dane jest odwołaniem do zmiennej lokalnej, chyba, że zmiennej lokalnej o takiej nazwie nie ma. Stąd bardzo w setterach częsty zapis: this.dane = dane, taki kod wygeneruje też IDE (np. Eclipse) jeśli zażyczysz sobie wygenerowania setterów i getterów.
  2. Moim zdaniem w tym zadaniu nie ma sensu "wciskanie obiektowości".
  3. Dla pola wynik, nie powinno w ogóle być settera, jeśli już się uprzesz by to pole było i napiszesz settery dla pozostałych pól, to powinny one wyglądać tak:
public void setLiczba(int liczba)
{
     this.liczba = liczba;
     this.wynik = obliczWynik();
}
  1. Imho, pole wynik jest niepotrzebne. Jego istnienie byłoby uzasadnione gdyby obliczenie wyniku było kosztowne. Dałoby się wtedy uniknąć wielokrotnego wykonywania tych samych obliczeń.
0

@bogdans
2. Moim zdaniem w tym zadaniu nie ma sensu "wciskanie obiektowości".
Otoż to, tak właśnie myślałem. Ale chce sie za wszelką cene tego nauczyć ale nie wiem na jakich zadaniach - innymi słowy kiedy mam korzystać z tej obiektowości, kiedy nie?

Co do setterów i getterów:
Czyli jeden setter może ustawiać wartości kilku polom? Moim problemem jest to, że chce wczytać od użytkownika jakąs wartość i przypisać ją do jakiegoś pola, ale za nic w świecie nie mam pojecia jak to poukładać. I to sie pojawia w każdym "zadaniu" jakie sobie wykonuje, a do tej pory coś mi nie pasuje i wiem, że coś robie źle. Prosze cie bardzo nakieruj mnie jakos :)

Jesli chodzi o bezsens uzywania pola "wynik" - tak rowniez myslalem, ale jak mówiłes - na siłe wpycham obiektowość żeby jakoś to rozumiec.
Ty zapewne długo juz programujesz stąd kierowałbym pytanie do ciebie: jak sie tego uczyłeś? ("tego" - mam na myśli obiektowości, tych wszyskich bilbiotek, tego wszystkiego co oferuje nam piękno JAVAy (jak Swing Vaadin Spring Wicket i te pozostałe nazwy)) sam wymyślałes sobie "wyzwania" i je wykonwałes? a może jakies ksiązki? może wykładowcy ci coś dali bo przypadkiem studiujesz informatyke? ;)

pozdrawiam! i ogromne dzieki za klarowne odpowiedzi :)

0
  1. Sytuacja, że jeden setter nadaje wartości kilku polom jest bardzo nietypowa. W tym przykładzie, pole wynik nie było "pierwotne", jego wartość wynikała z wartości dwóch innych pól. W konsekwencji każdy z setterów
public void setWynik(long wynik)
{
    this.wynik = wynik;
}
public void setLiczba(int liczba)
{
    this.liczba = liczba;
}

prowadziłby do niespójnych danych.
2. Moja droga do zrozumienia obiektowości chyba Ci się nie przyda, zainteresowałem się programowaniem po ukończeniu studiów matematycznych.
3. Zmodyfikuj swoje zadanie do takiej postaci: Program ma w pętli pytać użytkownika o dwie liczby typu int, zapamiętywać wszystkie wprowadzone dane, na życzenie wypisywać te dane, wykonywać obliczenia, pozwalać zmieniać wprowadzone dane. Sensowne byłoby takie rozwiązanie:

  • klasa Dane z dwoma polami liczba i iloscLiczb, konstruktorem Dane(int,int), dwoma setterami i dwoma getterami,
  • klasa Zad8 z polem typu ArrayList<Dane> do przechowywania wprowadzonych danych i metodami do czytania kolejnej pary liczb, wyświetlania kolekcji, modyfikacji,...
0

- klasa Zad8 z polem typu ArrayList<Dane> do przechowywania wprowadzonych danych i metodami do czytania kolejnej pary liczb, wyświetlania kolekcji, modyfikacji,...

Mozesz mi powiedzieć jak wyglada to pole typu ArrayList<Dane> i jak działa? nigdzie nie moge tego odszukać :(

A w ogole to w całym zadaniu maja byc 2 klasy, i klasa Zad8 ma mieć rozszerzenie/nowy obiekt klasy Dane?
Jaka jest różnica pomiędzy rozszerzaniem jakiejś klasy B o klase A, a tworzeniem nowego obiektu klasy B w klasie A? - inaczej czym sie różni rozszerzanie od implementowania nowego obiektu i korzystania z pól/metod klasy za jego posrednictwem?

@bogdans

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