Problem z przekazaniem tablicy

0

Witam,
czy możecie poprawić ten kod, chodzi głównie o przekazanie tablicy tab do funkcji silnia2
Z góry wielkie dzięki.

public class silnia
{
public void silnia2(int tab[], int n, int k)
{
int num=1;
int tmp=tab[k];
if(k==n)
{
System.out.print (" " + num + " : ");
for (int i=0;i<n;i++)
System.out.print (" " + tab[i] + " ");
num++;
return;
}
for(int i=k;i<n;i++){
tab[k]=tab[i];
tab[i]=tmp;
silnia2(tab,n,k+1);
tab[i]=tab[k];
tab[k]=tmp;

}

}

public static void main(String args[])
{
	int tab[]={1,2,3,4};

//	int nn[]=tab[];
//	int nn=4;
//	int mm=0;
	try
	 {
	silnia2(tab[],4,0);
	 } //koniec btry 
	  catch (ArrayIndexOutOfBoundsException e)
	  { };
//	System.out.print (" " + num + " : ");
}

}

0

Nie przyglądałem się dokładnie programowi, nie wiem czy sam algorytm działania jest poprawny, ale chodziło Ci pewnie tylko o uruchomienie go, sam najlepiej wiesz do czego miał służyć :].

metoda 'main(String args[])' jest statyczna, a w metodzie statycznej możesz używać tylko pól/metod również statycznych. Mógłbyś po prostu przed 'public void silnia2(int[] tab, int n, int k)' dać 'public static...' i by działało.. jeżeli jednak wolisz nie działać na static'ach:

public class silnia {

    silnia () {
        int[] tab={1,2,3,4};

        //        int nn[]=tab[];
        //        int nn=4;
        //        int mm=0;
        try {
            silnia2(tab,4,0);
        } //koniec btry
        catch (ArrayIndexOutOfBoundsException e) { }
        //        System.out.print (" " + num + " : ");
    }

    public void silnia2(int[] tab, int n, int k) {
        int num=1;
        int tmp=tab[k];
        if(k==n) {
            System.out.print (" " + num + " : ");
            for (int i=0;i<n;i++) System.out.print (" " + tab[i] + " ");
            num++;
            return;
        }
        for(int i=k;i<n;i++) {
            tab[k]=tab[i];
            tab[i]=tmp;
            silnia2(tab,n,k+1);
            tab[i]=tab[k];
            tab[k]=tmp;
        }
    }

    public static void main(String args[]) {
        new silnia();
    }
}

W statycznym 'main' tworzymy tylko nowy obiekt klasy 'silnia' (wywołujemy jej konstruktor silnia()), do którego skopiowałem Twój kod z 'main'.

btw. zauważyłem w kodzie coś takiego: silnia2(tab[],4,0); 'tab' to jest Twoja tablica, 'tab[]' używasz tylko przy deklaracji (lub inaczej 'int[] tab = ...', jak napisałem powyżej).

0

Wielkie dzięki za szybką odpowiedź
Mam jeszcze prośbę w jaki sposób mogę pozbyć się TRY {} ... catch (ArrayIndexOutOfBoundsException e) { }; w powyższym programie, gdyż przez obsłuę błedu TRY program nic mi nie wypisuje.

Ogólnie program przerobiłem z c++ i miał za zadanie wyświetlić wszystkie permutacje 4 liczb

Z góry wielkie dzięki

0
for(int i=k;i<n;i++) {
    tab[k]=tab[i];
    tab[i]=tmp;
    silnia2(tab,n,k+1);
    tab[i]=tab[k];
    tab[k]=tmp;
}

'silnia2()' w ostatnim jej wywołaniu ma nadany parametr 'k(nowej metody) = k+1 = n', a na początku tej metody próbujesz przypisać: int tmp=tab[k];
czyli tab[4] (bo w konstruktorze wywołujesz metodę 'silnia2()' z parametrem n=4), a ta tablica ma 4 elementy (liczymy od 0, czyli kończymy na 3 - ale to pewnie wiesz, z tego co widzę jak tworzysz te pętle (zaczynasz od i=0)). Nie chcę się zagłębiać w działanie tego programu, bo zwyczajnie jestem zmęczony :), dlatego pójdę łatwym rozumowaniem, mając nadzieję, że dobrze opracowałeś resztę: ostatnie wywołanie metody 'silnia2()' przeprowadzi tylko pierwszy warunek 'if (k==n)...', a dalsza pętla 'for...' nie wykona się ani razu. Za warunkiem 'if (k==n)' nie używasz nigdzie zmiennej 'tmp', czyli w ostatnim wywołaniu nie jest ona potrzebna, zatem przy ostatnim wywołaniu, nie musimy jej przypisywać wartości. Reasumując:

public void silnia2(int[] tab, int n, int k) {
        int num=1;
        int tmp=0; if (n!=k) tmp=tab[k];   //<<<-----------------------------------------patrz tutaj :)
        if(k==n) {
            System.out.print (" " + num + " : ");
            for (int i=0;i<n;i++) System.out.print (" " + tab[i] + " ");
            num++;
            return;
        }
        for(int i=k;i<n;i++) {
            tab[k]=tab[i];
            tab[i]=tmp;
            silnia2(tab,n,k+1);
            tab[i]=tab[k];
            tab[k]=tmp;
        }
    }

polecam po 'catch' dać: e.printStackTrace();, to zaprowadzi Cię do błędu.

0

Wielkie wielkie dzięki. Procedura działa, będę teraz musiał ją wykorzystać do głównego programu, jak coś to się odezwę :) :-) . Tak naprawdę to pierwszy raz w życiu skorzystałem z tej metody rozwiązania problemu na forum. Nie myślałem, że są Tacy jak Ty, którzy się zainteresują problemem.
Jeszcze raz wielkie dzięki.

Pozdro

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