Dynamiczne powiększanie tablicy

0

Zadanie:Ogólnie program pobiera liczby do tablicy, sumuje je oraz podaje ile zostało ich wpisanych, kiedy wpiszemy 0 ma zakończyć przyjmowanie ich do tablicy i zwrócić wyniki. Tablica ma zmieniać indeks o jeden w górę za każdym razem kiedy użytkownik wpisze liczę różną od 0, w efekcie czego ma się nigdy nie zapełnić. Nie radzę sobie z drugą częścią.

Scanner skaner = new Scanner(System.in);
        int[] liczby = new int[10];
        int suma = 0;
        int ilosc = 0;
 
	
        // Pytamy użytkownika o kolejne liczby tak długo, póki nie wpisze zero 
	
        for (int i = 0; i < liczby.length; i++) {
            System.out.print("Podaj liczbę: ");
            liczby[i] = skaner.nextInt();
	
	
            if (liczby[i] == 0) {
                ilosc = i;
                break;
	
            }
            else if(liczby[i]!=0){
                liczby[i]=liczby[i+1];
            }
        }
	
        // Sumowanie wszystkich podanych liczb ze sobą
	
        for (int i = 0; i < ilosc; i++)
            suma += liczby[i];
	
        // Wyświetlanie wyniku
	
        System.out.println("Suma twoich liczb wynosi: " + suma);
        System.out.println("Ilość twoich liczb wynosi" + ilosc);
1

Generalnie podejścia są dwa:
A. W normalnym (nie-ćwiczeniowym) kodzie w tym wypadku użyłoby się listy.
http://docs.oracle.com/javase/7/docs/api/java/util/List.html (ArrayList / LinkedList)
Np. (piszę z głowy, przepraszam za ew błędy)

List<int> liczby = new ArrayList<int>();
// ...
liczby.add(nowa_liczba);
// ...
for (int liczba : liczby) {
  suma += liczba;
}

B. Ew. możesz zrobić tzw. realokacje (ArrayList robi to za Ciebie), która sprowadza się do trzech kroków, robionych przy dodawaniu nowej liczby:

  1. Alokujesz nowa tablice, o jeden* większą (np. int[] nowe_liczby = new int[liczby.length + 1]).
  2. Kopiujesz do niej wszystkie dane ze starej tablicy (System.arrayCopy).
  3. Wpisujesz w „dodatkowy” element nową liczbę.
  4. Robisz liczby = nowe_liczby;
    • w praktyce zazwyczaj alokuje się tablicę 2 razy większą (a nie o jeden) i posiada dodatkową zmienną, którą śledzi się ile jeszcze miejsca zostało; jak się miejsce skończy, dopiero wtedy robi się kolejną re-alokacje length*2.

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