Skocz do zawartości
Hawk2

[java] Dodawanie Macierzy - Error

Rekomendowane odpowiedzi

Witajcie, na ćwiczenia z programowania mam już wszystkie programy oprócz ostatniego, a konkretniej to wywala mi w nim błąd.

 

Kod programu[z komentarzami, bo tak musimy wysyłać]

public class Zad6 {	/**	 * @param args	 */	public static void main(String[] args) {		// TODO Auto-generated method stub		int n=Integer.parseInt(args[0]);					//n typu integer podawane jest jako parametr		int m=Integer.parseInt(args[1]);					//m typu integer podawane jest jako parametr		double liczba;										//tworzymy zmienna zmiennoprzecinkowa o nazwie 'liczba'		System.out.println("A=");							//Wypisujemy pierwsza macierz:		int tab1[][]=new int[n][m];							//tworzymy w pamieci miejsce na tablice 'tab1' na 'n*m' liczb		for (int i=1;i<=n;i++){								//dla i<=n wykonaj[a po wykonaniu zwieksz i o 1]:			for (int j=1;j<=m;j++){							//dla j<=m wykonaj[a po wykonaniu zwieksz j o 1]:				liczba=Math.random()*100;					//generuj losowa liczbe z zakresu 0-100 w miejsce zmiennej liczba				int liczba2=(int)liczba;					//konwertuj liczbe zmiennoprzecinkowa na stalopozycyjna				tab1[i][j]=liczba2;							//do miejsca 'i' tablicy tab1 wpisujemy liczbe 'liczba2'				System.out.print(liczba2+"\t");				//wypisz liczbe i uzyj tabulacji, aby stworzyc rowny odstep				if (j==m)									//jezeli 'j' jest rowne 'm' czyli doszlismy do ostatniej kolumny, wykonaj:					System.out.println();					//przejdz do nastepnej linii			}		}		System.out.println();								//po wypisaniu macierzy A przejdz do nastepnej linii		System.out.println("B=");							//Wypisujemy druga macierz:		int tab2[][]=new int[n][m];							//tworzymy w pamieci miejsce na tablice 'tab2' na 'n*m' liczb		for (int i=1;i<=n;i++){								//dla i<=n wykonaj[a po wykonaniu zwieksz i o 1]:			for (int j=1;j<=m;j++){							//dla j<=m wykonaj[a po wykonaniu zwieksz j o 1]:				liczba=Math.random()*100;					//generuj losowa liczbe z zakresu 0-100 w miejsce zmiennej liczba				int liczba2=(int)liczba;					//konwertuj liczbe zmiennoprzecinkowa na stalopozycyjna				tab2[i][j]=liczba2;							//do miejsca 'j' tablicy tab2 wpisujemy liczbe 'liczba2'				System.out.print(liczba2+"\t");				//wypisz liczbe i uzyj tabulacji, aby stworzyc rowny odstep				if (j==m)									//jezeli 'j' jest rowne 'm' czyli doszlismy do ostatniej kolumny, wykonaj:					System.out.println();					//przejdz do nastepnej linii			}		}		System.out.println();								//po wypisaniu macierzy B przejdz do nastepnej linii		System.out.println("C=A+B=");						//Wypisujemy macierz C		for (int i=1;i<=n;i++){								//dla i<=n wykonaj[a po wykonaniu zwieksz i o 1]:			for (int j=1;j<=m;j++){							//dla j<=m wykonaj[a po wykonaniu zwieksz j o 1]:				System.out.print(tab1[i][j]+tab2[i][j]+"\t");		//wypisz sume tab1[i] i tab2[j] i oddziel tabulacja				if (j==m)									//jezeli 'j' jest rowne 'm' czyli doszlismy do ostatniej kolumny, wykonaj:					System.out.println();					//przejdz do nastepnej linii						}		}	}}

Wypisuje mi fragment macierzy, wywalając błąd:

 

A=20	82	16	34	Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5	at Zad6.main(Zad6.java:18)

W zadaniu chodzi o to, aby na podstawie macierzy A i B stworzyć sumaryczną macierz C. Nie wiem co mam źle, wydawało mi się, że będzie ok :P ktoś pomoże? Muszę to jeszcze dzisiaj wysłać :oops: [najwyżej z tego co już mam będzie niższa ocena, trudno].

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dzięki wielkie! Pomogło :lol2: na taki pomysł bym chyba nie wpadł :P nie wiedziałem gdzie niby leży błąd. Raz jeszcze dzięki :)

 

P.S. jest jakaś reguła kiedy unikać "<="?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zauważ, że deklaracja int tab1[][]=new int[n][m]; daje tablicę o indeksach od 0 do n-1 i od 0 do m-1. Teraz już chyba wszystko jasne ;)

Edytowane przez Dj_AnT

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wiem, że o górną[zawsze przy j-1 mi kończyło wypisywać, a przy j wywalało błąd] ale jak by nie było, obniżając i,j o jeden i zmieniając warunek wpłynąłem na górną granicę :P

 

Wtedy pętla się wykonywała tak [dla j=1 oraz n=3]:

j=1, j=2, j=3 i było wtedy j=n

Żeby przejść do nowej linii sprawdza j==n

 

Teraz się wykonuje tak [dla j=0 oraz n=3]:

j=0, j=1, j=2 i było wtedy j<n więc dla kolejnych przypadków nie wykonywało

Żeby przejść do nowej linii sprawdza j+1==n

 

W skrócie: zapisywało tab[j] ... tylko że i,j się zaczynały od 1, a tablice się zaczynają od 0, więc i,j się muszą zaczynać od 0 :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

debugery chyba wszystkie visualne działają i wyglądają jednakowo. Każdy ma możliwość postawienia breakpointa, możliwość pracy krokowej (step over) i wejścia w funkcję (step into), każdy też pokazuje wartość zmiennej po najechaniu na tą nazwę myszką, i okienko podglądu obiektów (quick watch, watch) w którym można sobie prawie dowolne rzeczy podglądać, przydatne są też podglądy typu autos, gdzie pokazują się np wartości zwracane z funkcji. To w prostych programach całkowicie wystarczy, nikt nie każe Ci od razu podglądać pamięć na żywca, bo to się robi dość rzadko :).

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...