Program macierze

Program macierze
S3
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 3 lata
0

Witam, mam mały problem programem który ma wymnożyć 2 miecierze A i B zapisać w macierzy C i wyświetlić:

macierz.java

Kopiuj


public class macierz{
int tab[][];
int res [][];
int lwierszy;
int lkolumn;

public macierz mnoz(macierz m){
    res=null;
	res= new macierz(lwierszy,m.lkolumn);
	
	if(lkolumn==m.lwierszy){
		for(int i=0;i<lwierszy;i++)
			for(int j=0;j<m.lkolumn;i++)
				for(int k=0;k<lkolumn;k++)
					res[i,j]+=tab[i,k]*m.[k,j];
	}
	return (res);

}

public  macierz (int lw,int lk){
	lwierszy=lw;
	lkolumn=lk;
	tab= new int [lwierszy][lkolumn];
	           for(int i=0;i<lwierszy;i++)
	        	   for(int j=0;j<lkolumn;i++)
	                	tab[i,j]=0;
}

public macierz (int a[][]){
	lwierszy=a.length;
	lkolumn=a[0].length;
	tab= new int[lwierszy][lkolumn];
	for(int i=0;i<lwierszy;i++)
		for(int j=0;j<lkolumn;j++)
			tab[i,j]=a[i,j];}
				
public String toString(){
	String a="";
	for(int i=0;i<lwierszy;i++){
		a+="\n";
		for(int j=0;j<lkolumn;j++)
			a+=tab[i,j]+"\t";}
	return(res);
}
}

start.java

Kopiuj
public class start{
	public start() {
    } 
public static void main() {
	macierz A= new macierz (int[][]){[1,0,4],[2,2,5],[3,5,4]};
	macierz B= new macierz (int[][]){[1,1,1],[1,1,1],[1,1,1]};
	C=A.mnoz(b);
	system.out.println(C.toString());
	

}
}

Nie za bardzo program się chce uruchomić :-/ i nie mogę dojść dla czego.

BS
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 12 lat
0

Nie wrzuciłem tego do kompilatora Javy, ale na oko widzę, że masz tu błędy. Domyślam się więc, że to Ci się nawet nie chce skompilować? Zobacz np. tu:

Kopiuj
public  macierz (int lwierszy,int lkolumn){
        lwierszy=lw;
        lkolumn=lk;

Co to jest lw i lk? Albo gdzie masz deklaracje zmiennych res? Weź zwróć uwagę na deklaracje (czy raczej definicje) zmiennych. Wszystkie muszą zawierać nazwę typu zmiennej. Jestem pewien, że takie rzeczy kompilator Ci wskaże bez problemu. Zobacz, jakie wyświetla błędy i po kolei je eliminuj.

Jeśli chcesz programować, to po prostu musisz się nauczyć samodzielnie poprawiać błędy kompilacji. Każdy takie błędy popełnia -- czasem nieopatrznie zmieni się nazwę jakiejś zmiennej, przeklei kod nie tak, czy o czymś zapomni (automatyczna refaktoryzacja pomaga, ale całego kodu automatycznie się nie napisze, więc błąd zawsze może się zdarzyć). Ew. jakby kompilator wyświetlił Ci wyjątkowo skomplikowany lub nieadekwatny błąd, to wtedy możesz o nim tu napisać (ale raczej w dziale newbie).

W ogóle jakiego kompilatora/środowiska używasz? Samym javac lecisz, czy masz może powiedzmy Eclipse'a lub Netbeans? Zdajesz sobie sprawę, że kompilator w wypadku nieudanej kompilacji wyświetla listę błędów w kodzie, prawda? ;)

S3
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 3 lata
0
bswierczynski napisał(a)

Nie wrzuciłem tego do kompilatora Javy, ale na oko widzę, że masz tu błędy. Domyślam się więc, że to Ci się nawet nie chce skompilować? Zobacz np. tu:

Kopiuj
public  macierz (int lwierszy,int lkolumn){
        lwierszy=lw;
        lkolumn=lk;

Co to jest lw i lk? Albo gdzie masz deklaracje zmiennych res? Weź zwróć uwagę na deklaracje (czy raczej definicje) zmiennych. Wszystkie muszą zawierać nazwę typu zmiennej. Jestem pewien, że takie rzeczy kompilator Ci wskaże bez problemu. Zobacz, jakie wyświetla błędy i po kolei je eliminuj.

Już poprawione, ale dalej nie wiem co w mainie jest źle.

Edyta1: Eclipse

BS
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 12 lat
0

Inicjalizator tablicy wielowymiarowej (użyty w dwóch miejscach) jest źle napisany i źle umieszczony. Trochę dawno nie pisałem niczego w Javie, ale nie wydaje mi się, żeby przez ten czas w inicjalizatorach można było tak użyć znaków [ i ].

Tak wygląda inicjalizator zwykłej, jednowymiarowej tablicy (Ty masz dwuwymiarową, ale zaraz do tego dojdziemy):

Kopiuj
{1, 2, 3}

Czyli ogólnie tablica elementów A to:

Kopiuj
{A1, A2, A3}

A tablica dwuwymiarowa? Cóż, każdy z tych elementów sam może być tablicą. Czyli A1 to może być {1, 2, 3}, A2 to może być {4, 5, 6} i tak dalej. Tablica dwuwymiarowa (oznaczę ją gwiazdką na później):

Kopiuj
{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} } // (*)

Nie ma tu nigdzie nawiasów kwadratowych. Jeszcze jedna sprawa. Takiego zapisu możesz użyć jedynie raz, podczas inicjalizacji zmiennej, czyli tak:

Kopiuj
int[][] tab = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; 

Potem możesz tę zmienną tab przekazać jakiejś funkcji, czy konstruktorowi (jak w Twoim wypadku), czyli napisać:

Kopiuj
macierz a = new macierz(tab);

Ale możesz też zrobić to na skróty, z operatorem new. Użyj normalnego zapisu (*), ale poprzedź go operatorem new i nazwą typu. Nazwa typu to tablica dwuwymiarowa intów, czyli int[][]. Czyli w sumie:

Kopiuj
new int[][] { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }

A wraz z wywołaniem konstruktora:

Kopiuj
macierz a = new macierz( new int[][] { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} } );

Zwróć uwagę, że w kodzie miałeś m.in. źle postawione zwykłe, okrągłe nawiasy (wywołanie konstruktora).

S3
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 3 lata
0

poprawiłem parę rzeczy ale dalej nie wiem co zrobić:

Kopiuj
import java.util.*;
import java.io.*;

public class macierz{
int tab[][];
int lwierszy;
int lkolumn;

public macierz mnoz(macierz m){
	
	macierz res= new macierz(lwierszy,m.lkolumn);

	if(lkolumn==m.lwierszy){
		for(int i=0;i<lwierszy;i++)
			for(int j=0;j<m.lkolumn;i++)
				for(int k=0;k<lkolumn;k++)
					res[i,j]+=tab[i,k]*m.[k,j];
	}
	return (res);

}

public  macierz (int lw,int lk){
	lwierszy=lw;
	lkolumn=lk;
	tab= new int [lwierszy][lkolumn];
	           for(int i=0;i<lwierszy;i++)
	        	   for(int j=0;j<lkolumn;i++)
	                	tab[i,j]=0;
}

public macierz (int a[][]){
	lwierszy=a.length;
	lkolumn=a[0].length;
	tab= new int[lwierszy][lkolumn];
	for(int i=0;i<lwierszy;i++)
		for(int j=0;j<lkolumn;j++)
			tab[i,j]=a[i,j];
	}
				
public String toString(){
	String a="";
	for(int i=0;i<lwierszy;i++){
		a+="\n";
		for(int j=0;j<lkolumn;j++)
			a+=tab[i,j]+"\t";}
	return(a);
}
}
Kopiuj
public class start{
	public start() {
    } 
	          
	public static void main() {
	
        macierz A = new macierz( new int[][] { {1,0,4}, {2,2,5}, {3,5,4} } );
        macierz B = new macierz( new int[][] { {1,1,1}, {1,1,1}, {1,1,1} } );
        macierz C = new macierz( new int[][] { {0,0,0}, {0,0,0}, {0,0,0} } );
        C=A.mnoz(B);
        System.out.println(C.toString());
       

}
}
	
	

Pokazuje mi błąd przy:

Kopiuj
res[i,j]+=tab[i,k]*m.[k,j];
Kopiuj
...
tab[i,j]=0;
...
tab[i,j]=a[i,j];
...
a+=tab[i,j]+"\t";}
VG
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 8 lat
  • Postów:79
0

Zamien to odpowiednio na:

Kopiuj
res.tab[i][j] += tab[i][k] * m.tab[k][j];
Kopiuj
...
tab[i][j]=0;
...
tab[i][j]=a[i][j];
...
a+=tab[i][j]+"\t";}

Po tym program juz sie uruchomi, ale jeszcze bedziesz mial wyjatki ArrayIndexOutOfBoundsException. Spowodowane jest to tym, że w dwoch petlach for dzialajacych na zmiennej j inkrementujesz zmienna i:

for (int j = 0; j < m.lkolumn; i++)

Zmien w dwoch miejscach inkrementowana zmienna na j (zmieniaj tylko 3 czesc instrukcji, nie kopiuj tego co wkleilem, gdyz inne sa warunki zakonczenia tych dwoch petli):

for (int j = 0; j < m.lkolumn; j++)

Po tym chyba juz zadziala.

***EDIT
jeszcze poprawialem u siebie metode main, aby program zadzialal:

Kopiuj
public static void main(String[] args)

S3
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 3 lata
0

Dzięki Panowie nie ma żadnego już błędu, tylko teraz program nie może się odpalić bo "Could not find the main class."

Consola wyrzuca:
java.lang.NoClassDefFoundError: main
Caused by: java.lang.ClassNotFoundException: main
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Exception in thread "main"

0

A napisałeś klasę main? Z pierwszego postu wynika, że powinieneś program uruchamiać tak java start. Parametrem polecenia java winna być nazwa klasy startowej, klasa startowa musi zawierać metodę public static void main(String[] args).

S3
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 3 lata
0

tak wygląda clasa start

Kopiuj
public class start{
	public start() {
    } 
	public static void main(String[] args){
	
        macierz A = new macierz( new int[][] { {1,0,4}, {2,2,5}, {3,5,4} } );
        macierz B = new macierz( new int[][] { {1,1,1}, {1,1,1}, {1,1,1} } );
        macierz C = new macierz( new int[][] { {0,0,0}, {0,0,0}, {0,0,0} } );
        C=A.mnoz(B);
        System.out.println(C.toString());
       

}
}
	
	

0

Klasa start jest poprawna, ale jak uruchamiasz program? Komunikat o błędzie sugeruje, że tak:
java main
a powinieneś tak:
java start

S3
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 3 lata
0

Hmmm dziwne wczoraj jak próbowałem odpalić nie działało a teraz śmiga, możliwe że Eclipse miało coś w pamięci.

Dzięki chłopaki za wskazówki :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.