Program macierze

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



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

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.

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:

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? ;)

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:

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

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):

{1, 2, 3}

Czyli ogólnie tablica elementów A to:

{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):

{ {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:

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ć:

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:

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

A wraz z wywołaniem konstruktora:

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).

0

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

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);
}
}
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:

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

Zamien to odpowiednio na:

res.tab[i][j] += tab[i][k] * m.tab[k][j];
...
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:

public static void main(String[] args)
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).

0

tak wygląda clasa start

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

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 :)

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