Wątek przeniesiony 2018-10-23 11:56 z Java przez Patryk27.

Tablica o dynamicznej długości

0

Cześć,

Jestem początkujący w programowaniu w języku java i mam za zadanie napisać program, który wczyta liczbę i wypisze jej dzielniki, ale są pewne wytyczne. Mianowicie należy najpierw zdefiniować wszystkie potrzebne funkcje, a potem zbudować z nich program. Funkcje, które mają być w programie to:

readNumber - wczytuje liczbę naturalną ze standardowego wejścia i zwraca ją.
checkDivider - sprawdza, czy liczba a dzieli się przez liczbę b.
findDividers - dla zadanej liczby x przechodzi po wszystkich liczbach od 1 do x/2. Jeśli dana liczba jest dzielnikiem x, zapisuje ją w tablicy rezultatów.
printDividers - wypisuje wszystkie znalezione dzielniki.

Utknąłem przy funkcji 3 i 4. Nie mam bladego pojęcia i nie mogę doszukać się informacji w jaki sposób mam przypisać dzielniki do tablicy i jak później wypisać tę tablicę. Poniżej mój kod. Jakaś podpowiedź ?

import java.util.*;

class funkcje {
	int a, dzielnik=1;

	public void readNumber() {
		System.out.println("Wprowadź liczbę w celu sprawdzenia jej dzielników.");
		
		Scanner in = new Scanner(System.in);
		a = in.nextInt();
		System.out.println(a);
	}

	public boolean checkDivider() {
		boolean yes = (a % 2 == 0);
		int b=3;
		while (b <= (a/2) && yes)
			if (a%b==0) yes = false;
			else b+=2;
			return yes;
	}	
	
	public void findDividers() {
		int[] tab = new int[10];
		
		for(int i=1; i<=a/2; i++)
		{
			if(a%dzielnik == 0)
				tab[i] =  a/dzielnik;
                          dzielnik++;
		}
		
	}
		
	
	public void printDividers() {
			
		System.out.println();
		}
		
	}

public class Main {
	public static void main(String[] args) {
	

		funkcje f1 = new funkcje();
		
		f1.readNumber();
		f1.checkDivider();
		f1.findDividers();
		f1.printDividers();
	}

}


0
  1. Nigdzie w opisie metody readNumber nie widzę ani Metoda powinna wypisywać "Wprowadź liczbę w celu sprawdzenia jej dzielników." na standardowe wyjście., ani Metoda powinna wypisywać wprowadzoną liczbę na standardowe wyjście. - trzymaj się specyfikacji ;-)

  2. Nie wiem co to za skomplikowany algorytm wykombinowałeś do checkDivider, ale wystarczy przecież sprawdzić czy a % b == 0.

  3. Zasadniczo to wystarczy sprawdzać dzielniki do pierwiastka z n.

  4. Odnośnie głównego problemu: nie powinieneś na sztywno deklarować tablicy z dziesięcioma elementami (new int[10]), ponieważ nie wiesz, ile ich będzie. Poczytaj o ArrayList.

Edit: dodatkowo nie przekazuj wszystkiego przez pola klasy - zrób z tego normalne parametry funkcji; dzięki temu prościej będzie przeanalizować co z czym sie łączy.

0
Patryk27 napisał(a):
  1. Nigdzie w opisie metody readNumber nie widzę ani Metoda powinna wypisywać "Wprowadź liczbę w celu sprawdzenia jej dzielników." na standardowe wyjście., ani Metoda powinna wypisywać wprowadzoną liczbę na standardowe wyjście. - trzymaj się specyfikacji ;-)

jasna sprawa :)

0

Ano ArrayList to jest coś innego niż tablica jednowymiarowa - dlatego nazywa się inaczej ;-)

public List<Integer> findDividers(int a) {
  List<Integer> dividers = new ArrayList<>();
  
  for (int i = 1; i <= a/2; ++i) {
    if (a % i == 0) {
      dividers.add(i);
    }
  }
  
  return dividers;
}
0

tak, za pomocą ArrayList zrobiłem nim wrzuciłem posta i działało, ale co jeśli chce żeby to była tablica jednowymiarowa ?

Czy można to zrobić w ten sposób, że zostanie stworzona pusta tablica w funkcji findDividers i za każdym razem kiedy warunek if w pętli for będzie spełniony to dzielnik będzie dodawany do tablicy, a po zakończeniu pętli tablica zostanie wypisana?

Jesli tak to problem tkwi w tym w jaki sposób mogę dodać każdy jeden dzielnik to pustej tablicy?

1

Tablice jednowymiarowe w Javie mają stałe rozmiary, dlatego nie nadają się dla takich zastosowań.

https://stackoverflow.com/questions/1647260/java-dynamic-array-sizes - pierwsza odpowiedź tutaj opisuje jak do tego podejść z wykorzystaniem tablic, lecz nie należy tak robić.

Powinieneś dobierać abstrakcje do zastosowań: stała lista = int[], dynamiczna lista = ArrayList<Integer> (bądź inne warianty).

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