Hawk2 Opublikowano 18 Maja 2008 Zgłoś Opublikowano 18 Maja 2008 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]. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
kfgz Opublikowano 18 Maja 2008 Zgłoś Opublikowano 18 Maja 2008 Indeks tablicy poza granicami? Spróbuj w pętlach for dać < zamiast <=. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Hawk2 Opublikowano 18 Maja 2008 Zgłoś Opublikowano 18 Maja 2008 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ć "<="? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
kfgz Opublikowano 18 Maja 2008 Zgłoś Opublikowano 18 Maja 2008 (edytowane) 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 18 Maja 2008 przez Dj_AnT Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Hawk2 Opublikowano 18 Maja 2008 Zgłoś Opublikowano 18 Maja 2008 Ach, bo tablice są numerowane od 0 ... a ja miałem i,j zaczynające się od 1 :P [chyba o to chodzi? ;)] Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
kfgz Opublikowano 18 Maja 2008 Zgłoś Opublikowano 18 Maja 2008 W twoim konkretnym przypadku chodzi o górną, a nie dolną granicę. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Hawk2 Opublikowano 18 Maja 2008 Zgłoś Opublikowano 18 Maja 2008 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 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 18 Maja 2008 Zgłoś Opublikowano 18 Maja 2008 nie wiedziałem gdzie niby leży błąd. Raz jeszcze dzięki :) gdybyś użył debugera to byś wiedział :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
shooter Opublikowano 7 Lipca 2008 Zgłoś Opublikowano 7 Lipca 2008 ciezko sie polapac w tym debugerze. same adresy pamieci. ciul wie o co chodzi. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
PelzaK Opublikowano 7 Lipca 2008 Zgłoś Opublikowano 7 Lipca 2008 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 :). Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...