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);
        }
  1. 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