Błąd Exception in thread "main" java.lang.Array.. POMOCY

0

Witam jestem początkujący w programowaniu, napisałem program sortowania bąbelkowego według schematu blokowego podanego na lekcji przez nauczyciela. Oto on:


  import java.util.Scanner; 
public class Babelkowe {

    public static void main(String[] args) {

int a,k,tmp,i,element;
boolean posortowane; 
k=1;

//Ilosc komorek
System.out.println("Podaj ilosc komorek tablicy : ");
Scanner odczyt = new Scanner(System.in);
a = odczyt. nextInt();  

//Zakladanie tablicy

int[]tab=new int[a];
//Wypelnianie tablicy

for (i=0; i<a; i++)
{
    System.out.println("Podaj "+k+"  komorke tablicy: ");
    k++;    
    tab[i] = odczyt. nextInt();
}
//Sortowanie

do
    {
    posortowane=true;
    i=1;

    do
     { 
          if (tab[i]>tab[i+1])
          {
          posortowane=false;
          tmp = tab[i];
          tab[i]=tab[i+1];
          tab[i+1]=tmp;             
          i=i+1;                        
              }     
              else
              {
             i=i+1;
              }
     }
     while(i<a);                
    }
    while (posortowane!=true); 

//Wypisanie
for(i= 0 ; i<a; i++)
{
    System.out.println("Posortowane liczby :"+ tab[i]);
}
}}

Program się kompiluje oraz uruchamia po wprowadzeniu ilości komórek tablicy oraz wypełnieniu ich otrzymuję następujący komunikat:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
        at Babelkowe.main(Babelkowe.java:41)

Pomóżcie :<

1

Tablice w javie indeksowane sa od 0. Probujesz odwolac sie do nieistniejacego elementu w tablicy (tab[3] dla 3-elementowej tablicy). W petli zacznij iterowac od 0 (i=0)

0

Zmieniłem i=1 na i=0. Wyskakuje ciągle ten sam komunikat : <

1

Zmien warunek i<a na i<(a-1)

0

Wielkie dzięki kszychu ! :D

0

Nadużywasz pętli do..while.
Nie mówię, że nie powinno się ich w ogóle stosować, ale while..do jest łatwiejsze dla początkujących.

Przeanalizuj np. co Twój program robi dla a==1. Dla jednoelemetowej tablicy nie powinien wykonywać żadnych porównań.

0

Spróbuj poniższego kodu. Przeanalizuj i uporządkuj swój, bo straszny bałagan robisz. ;)

package rnest.Rozne.pak1;

import java.util.Scanner;

public class Babelkowe {

    public static void main(String[] args) {

        System.out.println("Wpisz ile liczb chcesz posortować:");
        Scanner sc = new Scanner(System.in);
        int rozmiar = sc.nextInt();
        int tab[] = new int[rozmiar];

        System.out.println("Wpisz liczby do posortowania:");
        for(int i = 0; i <= rozmiar - 1; i++){
            int ilosc = sc.nextInt();
            tab[i] = ilosc;
        }

        sc.close();

        int temp = 0;
        int i = 0;
        int licznik = 0;

        for(i = tab.length - 1; i >= 1; i--){

            for(licznik = 1; licznik <= i; licznik++){

                if(tab[i] < tab[i - licznik]){
                   temp = tab[i - licznik];
                   tab[i - licznik] = tab[i];
                   tab[i] = temp;
                } 
            }  
        }

        System.out.println("Wypisuję posortowaną tablicę:");

        for(i = 0; i < tab.length; i++){
            System.out.print(tab[i] + " ");

        }   
    }

}
0

Dlaczego zmuszać użytkownika do wpisywania dużej ilości liczb?

  1. Dopuszczamy, że liczby się powtarzają.
        int[] tab = new int[rozmiar];
        Random r = new Random();
        for(int i=0;i<rozmiar;i++)
        {
            tab[i] = r.nextInt(4*rozmiar);
        }
  2. Liczby nie mogą się powtarzać.
        int[] tab = new int[rozmiar];
        ArrayList<Integer> liczby = new ArrayList<Integer>();
        for(int i=0;i<4*rozmiar;i++)
        {
            liczby.add(i);
        }
        Collections.shuffle(liczby);
        for(int i=0;i<rozmiar;i++)
        {
            tab[i] = liczby.get(i);
        }
0

Też fajnie. Myślę, że gaskaspica na zajęciach nie ma jeszcze elementów kolekcji ...

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