Kezdőoldal » Számítástechnika » Programozás » Egyszerű rendezős utasítássor...

Egyszerű rendezős utasítássor hibaüzenettel tér vissza. Mi lehet a probléma?

Figyelt kérdés

Egy hete kezdtem ismerkedni a Java-val.


Próbáltam írni benne egy kódot, ami megrendezi a számokat. Sikeresen ki is írja rendezve, viszont mellé kaptam még

egy hibaüzenetet is :

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 at szamlalo.main(szamlalo.java:14).


A kód:

class szamlalo {

public static void main(String[] args) {

int[] szam ={21, 10, 3, 100, 21, 32};

for (int i = 0; i < szam.length-1; i++) {

for (int j = 0; j < szam.length-1; j++) {

if (szam[j] > szam[j+1]) {

int s = szam[j];

szam[j] = szam[j+1];

szam[j+1] = s;

}

}

}

for (int i = 0; i <=szam.length; i++) {

System.out.print(szam[i] + " ");

}

}

}


Vajon mi lehet a probléma?



2014. júl. 30. 00:53
 1/6 anonim ***** válasza:

For cikluson belül folyamatosan integert foglalni nem túl okos ötlet.


Másrészt, ha foglalsz egy int[] szam ={21, 10, 3, 100, 21, 32}; tömböt, akkor szam.length 6 értéket fog adni, vagyis a tömböt 0-5-ig tudod indexelni, és az utolsó elemnél a for ciklusod szam.length-1 ugyan 5 értékű lesz, de az egyel nagyobb elem szam[j] = szam[j+1]; vagyis szam[5] = szam[6];-nál fog kiakadni, mert nincs 6-os számú elem a tömbben.


Teljesen jogos, hogy exceptiont dob. Megoldás a buborékrendezésre:

for (int i = 0; i < szam.length-1; i++) {

for (int j = 0; j < szam.length-2; j++) {

2014. júl. 30. 06:45
Hasznos számodra ez a válasz?
 2/6 anonim ***** válasza:
80%

> For cikluson belül folyamatosan integert foglalni nem túl okos ötlet.


A fordító okos, nem fog minden iterációban integert foglalni. Nem az az optimalizáció, ha kirakod a ciklusból ezeket a sorokat. Ezt a balgaságot nem tudom honnan szedted, de felejtsd el! Még a hőskorszakban is tudták ezt a fordítóprogramok.


A két kódrészlet ugyan azt a gépi kódot eredményezi:


for (;;)

{

  int i = 4;

  dosomething(i);

}


int i;

for (;;)

{

  i = 4;

  dosomething(i);

}


Próbáld ki ha nem hiszed.

2014. júl. 30. 09:23
Hasznos számodra ez a válasz?
 3/6 anonim ***** válasza:
78%

És az első válaszoló második "problémája" is hülyeség. A ciklus addig ment, míg kisebb, mint length-1. Azaz 4-ig. És 4-es és 5-ös elem van. Ezekkel semmi gond nincs.

Másrészt a módosításával a {21, 10, 3, 100, 21, 12} tömböt így "rendezi": {3, 10, 21, 21, 100, 12}

Amire a válaszoló gondolt sztem az, hogy szam.length-1-i-ig menjen a ciklus, ez így még gyorsabb is lesz.


A kérdező igazi gondja a kiírásnál van. i<=szam.length helyett i<szam.length kell

2014. júl. 30. 09:44
Hasznos számodra ez a válasz?
 4/6 iostream ***** válasza:
69%
Na igen, főleg, hogy ott nem foglal ciklust, csak feljebb böki a stack pointert. Már ha nem optimalizálja ki a fordító, amit persze ki fog. De a "foglalás" itt egy összeadás, ráadásul regiszterbe. Azokat verném pofán, akik ilyen hülyeségek miatt nagyobb scope-ba teszik amit nem kéne.
2014. júl. 30. 10:45
Hasznos számodra ez a válasz?
 5/6 anonim ***** válasza:

> Azokat verném pofán, akik ilyen hülyeségek miatt nagyobb scope-ba teszik amit nem kéne.


Egyetértek kedves iostream. Az hogy egy scope-al fentebb teszik a deklarációt szerintem C vagy pascal beidegződés lehetett.


A nyelvek fejlődnek, a programozók nem mindig...

2014. júl. 30. 11:24
Hasznos számodra ez a válasz?
 6/6 A kérdező kommentje:
Köszönöm a válaszokat, sikerült javítanom(és megértenem) a problémát. Megy mindenkinek a pozitív:)
2014. júl. 30. 14:16

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!