Przekazywanie elementów tablicy między metodami

0

Witam,
Mam pewien problem z kodem w Javie. Napisałem program, który mnoży macierze w 4 osobnych pętlach. Stworzyłem dwie osobne metody. Jedna do wypełniania dwóch tablic, a druga do ich mnożenia. Zdefiniowałem zmienne i nie wiem jak przekazać wygenerowane elementy dwóch macierzy pomiędzy metodami. Z metody wypełniającej do mnożącej. Bardzo proszę o pomoc, za któą z góry dziękuję

import java.util.;
import javax.swing.
;

class procesory
{
int i,j,x1,x2,x3,x4,d,k;
String s;
int N;
int A [][] = new int [N][N];
int B [][] = new int [N][N];
int C [][] = new int [N][N];

//określanie wielkości macierzy
public void rozmiar()
{
s=JOptionPane.showInputDialog(null,"Podaj wymiar macierzy");
N=Integer.parseInt(s);
}

// d=N/4;
// x1=d;
// x2=2d;
// x3=3
d;
// x4=N;

//WYPEŁNIANIE MACIERZY****

	public void wypelnij()
	{
	

// s=JOptionPane.showInputDialog(null,"Podaj wymiar macierzy");
// N=Integer.parseInt(s);

rozmiar();
//System.out.print(N);
   	d=(N)/4;
   	x1=d;
   	x2=2*d;
   	x3=3*d;
   	x4=N;
   	System.out.println(x1);
   	System.out.println(x2);
   	System.out.println(x3);
   	System.out.println(x4);
   	int A [][] = new int [N][N];
   	int B [][] = new int [N][N];
   	

// wypełnianie macierzy
System.out.print("Macierz A\n");
for (int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
A[i][j]=(int)(Math.random()*65);
System.out.print(A[i][j]+"\t");
}
System.out.print("\n");
}
System.out.print("Macierz B\n");
for (i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
B[i][j]=(int)(Math.random()*65);
System.out.print(B[i][j]+"\t");
}
System.out.print("\n");
}
}

//MNOZENIE MACIERZY****

public void mnozenie() 

{
	
//	int A [][] = new int [N][N];
 //  	int B [][] = new int [N][N];
//	int C [][] = new int [N][N];
   	d=N/4;
   	x1=d;
   	x2=2*d;
   	x3=3*d;
   	x4=N;
	System.out.print("Macierz C\n");
for(i=0;i<x1;i++)
	{for( j=0;j<N; j++)
		{C[i][j]=0;
		   for (k=0;k<N;k++)
		   { C[i][j]+=A[i][k]*B[k][j]; 
		   
		   }
		   System.out.print(C[i][j]+"\t");
		   //System.out.print("\n");
		}
		System.out.print("\n");
	}
//	System.out.print("\n");
	

//drugi procesor

for( i=x1;i<x2;i++)
	{for( j=0;j<N; j++)
		{C[i][j]=0;
		   for (k=0;k<N;k++)
		   { C[i][j]+=A[i][k]*B[k][j];  
		   }
		   System.out.print(C[i][j]+"\t");
		}
		System.out.print("\n");
	}
//	System.out.print("\n");

// trzeci procesor

for( i=x2;i<x3;i++)
	{for( j=0;j<N; j++)
		{C[i][j]=0;
		   for (k=0;k<N;k++)
		   { C[i][j]+=A[i][k]*B[k][j];  
		   }
		   System.out.print(C[i][j]+"\t");
		}
		System.out.print("\n");
	}
//	System.out.print("\n");

// czwarty procesor

for( i=x3;i<x4;i++)
{for( j=0;j<N; j++)
{C[i][j]=0;
for (k=0;k<N;k++)
{ C[i][j]+=A[i][k]*B[k][j];
}
System.out.print(C[i][j]+"\t");
}
System.out.print("\n");
}

}

public static void main (String args[])
{
procesory obraz=new procesory();

// obraz.rozmiar();
obraz.wypelnij();
obraz.mnozenie();
}

}

Pozdrawiam

0

eee, a nie lepiej

public int[][] mnozenie(int[][] A,int[][] b){
       int[][]result=new int[A.lenght][b[0].lenght]; //czy jakos tak ;) nigdy nie pamietam ktore bylo ktore
       //Mnozymy
       return result;
}

??
pozdrawiam

0

szczerze moiwac totalnie nie rozumien tego kodu
po co te 4 petle tudziez "procesory", czyzby kazdy "procesor"mial mnozyc tylko czwarta czesc maciezy ??

Zdefiniowałem zmienne i nie wiem jak przekazać wygenerowane elementy dwóch macierzy pomiędzy metodami. Z metody wypełniającej do mnożącej.

zdefiniowales tablice jako zmienne klasowe i nie musisz ich nigdzie przenosic(zreszta sie nie da, jawa operuje na referencjach a nie na zmiennych), sa dostepne w calej klasie a nawet w klasach dziedziczacych(ale to juz inna bajka), tym co zwalone zostalo to ze tablice Od razu zainicjalizowales zmienna N ktora jeszcze nie istnije (swoja droga to dziwnne kopliator na caly glos powinniej zglaszac blad, hmmm?)

dopisz zaraz po wywolaniu metody rozmiar() i
inicjalizacji A i B (co ciekawe tu postapiles dobrze dlaczego zabraklo C ??)
int C [][] = new int [N][N];
Wczesniej tablica C byla wielkosci 0 i dlatego sie wszystko walilo

Pozdrawiam BookaYashee

ps jako bonusik dołączam kod klasy Matrix warto jej sie przyjrzec bo 2 tablice roznowymiarowe wypelniam liczbami losowymi w 2 petlach a nie jak "normalnie" sie to robi w 4 ;)
Szczegolnie sa ciekawe instrukcje

if(aXLen>bYLen)if(j<bYLen)c[i][j]=0;
else if(i<bYLen)c[i][j]=0;

;D

import java.util.*;
import java.io.*;
public class Matrix{
	static int a[][];
	static int b[][];
	static int c[][];
	static int aXLen;
	static int bYLen;
	
	static void init(){
		//nie daje sprawdzania czy wartosci wstawiane sa wieksze od zera
		//zakładam inteligencje urzytkownika ;)
		System.out.println("podaj szerokosc tablicy A i wyskokosc B");
		aXLen = readInt();
		System.out.println("podaj wysokosc tablicy A i szerokosc B");
		bYLen = readInt();
		
		a = new int[aXLen][bYLen];
		b = new int[bYLen][aXLen];
		c = new int[aXLen][aXLen];
		
			for(int i =0;i< aXLen;i++){
				for(int j=0; j<bYLen;j++){
					a[i][j] = (int)(Math.random()*65);
					b[j][i] = (int)(Math.random()*65);
					if(aXLen>bYLen)if(j<bYLen)c[i][j]=0;
					else if(i<bYLen)c[i][j]=0;
				}
			}
	}
	
	
	static void multiply(){
		for(int i=0;i<aXLen;i++){
			for(int j=0;j<aXLen;j++){
				c[i][j]=0;
				for(int k=0;k<bYLen;k++){
					c[i][j] += a[i][k] * b[k][j];
				}
			}
		}
	}
	
	static void showTab(int[][] tab){
		for(int i=0;i<tab.length;i++){
			for(int j=0;j<tab[0].length;j++){
				System.out.print(tab[i][j] + "\t");
			}
			System.out.println("\n");
		}
	}
	
public static int readInt(){
	try{
		return Integer.parseInt(new BufferedReader(
			new InputStreamReader(System.in)).readLine());
	}catch(Exception e){
		return -1;
	}
}
	public static void main(String[] args){
		init();
		multiply();
		
		System.out.println("Tablica A");
		showTab(a);
		System.out.println("Tablica b");
		showTab(b);
		System.out.println("Tablica C");
		showTab(c);
	}
}
0

szczerze moiwac totalnie nie rozumien tego kodu
po co te 4 petle tudziez "procesory", czyzby kazdy "procesor"mial mnozyc tylko czwarta czesc maciezy ??

Zdefiniowałem zmienne i nie wiem jak przekazać wygenerowane elementy dwóch macierzy pomiędzy metodami. Z metody wypełniającej do mnożącej.

zdefiniowales tablice jako zmienne klasowe i nie musisz ich nigdzie przenosic(zreszta sie nie da, jawa operuje na referencjach a nie na zmiennych), sa dostepne w calej klasie a nawet w klasach dziedziczacych(ale to juz inna bajka), tym co zwalone zostalo to ze tablice Od razu zainicjalizowales zmienna N ktora jeszcze nie istnije (swoja droga to dziwnne kopliator na caly glos powinniej zglaszac blad, hmmm?)

dopisz zaraz po wywolaniu metody rozmiar() i
inicjalizacji A i B (co ciekawe tu postapiles dobrze dlaczego zabraklo C ??)
int C [][] = new int [N][N];
Wczesniej tablica C byla wielkosci 0 i dlatego sie wszystko walilo

Pozdrawiam BookaYashee

ps jako bonusik dołączam kod klasy Matrix warto jej sie przyjrzec bo 2 tablice roznowymiarowe wypelniam liczbami losowymi w 2 petlach a nie jak "normalnie" sie to robi w 4 ;)
Szczegolnie sa ciekawe instrukcje

if(aXLen>bYLen)if(j<bYLen)c[i][j]=0;
else if(i<bYLen)c[i][j]=0;

;D

import java.util.*;
import java.io.*;
public class Matrix{
	static int a[][];
	static int b[][];
	static int c[][];
	static int aXLen;
	static int bYLen;
	
	static void init(){
		//nie daje sprawdzania czy wartosci wstawiane sa wieksze od zera
		//zakładam inteligencje urzytkownika ;)
		System.out.println("podaj szerokosc tablicy A i wyskokosc B");
		aXLen = readInt();
		System.out.println("podaj wysokosc tablicy A i szerokosc B");
		bYLen = readInt();
		
		a = new int[aXLen][bYLen];
		b = new int[bYLen][aXLen];
		c = new int[aXLen][aXLen];
		
			for(int i =0;i< aXLen;i++){
				for(int j=0; j<bYLen;j++){
					a[i][j] = (int)(Math.random()*65);
					b[j][i] = (int)(Math.random()*65);
					if(aXLen>bYLen)if(j<bYLen)c[i][j]=0;
					else if(i<bYLen)c[i][j]=0;
				}
			}
	}
	
	
	static void multiply(){
		for(int i=0;i<aXLen;i++){
			for(int j=0;j<aXLen;j++){
				c[i][j]=0;
				for(int k=0;k<bYLen;k++){
					c[i][j] += a[i][k] * b[k][j];
				}
			}
		}
	}
	
	static void showTab(int[][] tab){
		for(int i=0;i<tab.length;i++){
			for(int j=0;j<tab[0].length;j++){
				System.out.print(tab[i][j] + "\t");
			}
			System.out.println("\n");
		}
	}
	
public static int readInt(){
	try{
		return Integer.parseInt(new BufferedReader(
			new InputStreamReader(System.in)).readLine());
	}catch(Exception e){
		return -1;
	}
}
	public static void main(String[] args){
		init();
		multiply();
		
		System.out.println("Tablica A");
		showTab(a);
		System.out.println("Tablica b");
		showTab(b);
		System.out.println("Tablica C");
		showTab(c);
	}
}
0

heh powstal jduplikat posta, server sie walnol w czasie wysylania ale i tak uiescil posta :/
do moderatora prosze usunac zbednego posta :)

0

w ogole w kwestji samej przejrzystosci i trzymania sie przyjetych regol pisania :) nie powinno wygladac to tak :)

int[][] A = new ...

??:>

0

nie jestem zarejestrowany wiec edytowac nie moge ...
a nie widzisz zmiennych dlatego poniewaz:
na samym poczatku twozysz zmienne publiczne
int[][] A B i C a nastepnie twozysz zmienne tej samej nazwy tylko lokalnie z ograniczonym zakresem po wykonaniu funkcji JVM traci referencje do lokalnych zmiennych A B i C co na 99% uruchamia System.gc():) i w ten oto prosty sposob caly proces wypelniania twoich tablic znika jak brud po domestosie :)

0

To jest dopiero początek programu. Docelowo stworzę 4 odrębne klasy(wątki). Każda z nich będzie odpowiedzialna za wymnożenie określonej części macierzy w zależności od jej rozmiaru. Umożliwi to równoległą pracę programu. Zaraz się zabieram do pracy. Jak będą jakieś problemy(w co nie wątpię) to pozwolę sobie jeszcze zapytać. Dzięki za pomoc

0

Witam,
Dzięki za pomoc. Udało mi się w końcu z tym poradzić. Stworzyłem program, który podzielony został na wątki. Cztery wątki odpowiedzialne są za mnożenie określonych części macierzy. Jest tylko jeden problem. Wszystko działą ok, do momentu, gdy rozmiar macierzy A,B jest nie większy niż 7x7. Jeżeli jest większy to wszystko się sypie. Może ktoś z was będzie mi w stanie pomóc. Ja nie mam pomysłów. Z góry dziękuję.

import javax.swing.;
import java.util.
;
import java.io.;
import java.lang.
;
import java.awt.event.;
import java.awt.
;

//pierwszy procesor

class mnozenie1 extends ostateczny_1 implements Runnable
{
Thread mnoz1;

public void uruchom_mnoz1()
{
	mnoz1 = new Thread(this);
	mnoz1.start();
}
public void run()
{
System.out.print("\nMacierz C\n");
for(i=0;i<x1;i++)
	{for( j=0;j<N; j++)
		{C[i][j]=0;
		   for (k=0;k<N;k++)
		   { C[i][j]+=A[i][k]*B[k][j]; 
		   
		   }
		   System.out.print(C[i][j]+"\t");
		}
		System.out.print("\n");
	}
}

}
//drugi procesor

class mnozenie2 extends ostateczny_1 implements Runnable
{

Thread mnoz2;

public void uruchom_mnoz2()
{
	mnoz2 = new Thread(this);
	mnoz2.start();
}
public void run()
{ 			
for( i=x1;i<x2;i++)
	{for( j=0;j<N; j++)
		{C[i][j]=0;
	
		   for (k=0;k<N;k++)
		   { C[i][j]+=A[i][k]*B[k][j];  
		   }
		   System.out.print(C[i][j]+"\t");
		}
		System.out.print("\n");
	}
	
	}
}

// trzeci procesor

class mnozenie3 extends ostateczny_1 implements Runnable
{
Thread mnoz3;

public void uruchom_mnoz3()
{
	mnoz3 = new Thread(this);
	mnoz3.start();
}

public void run()
{
for( i=x2;i<x3;i++)
	{for( j=0;j<N; j++)
		{C[i][j]=0;
		   for (k=0;k<N;k++)
		   { C[i][j]+=A[i][k]*B[k][j];  
		   }
		   System.out.print(C[i][j]+"\t");
		   //System.out.print("\n");
		}
		System.out.print("\n");
	}
	}
}

// czwarty procesor

class mnozenie4 extends ostateczny_1 implements Runnable
{
Thread mnoz4;

public void uruchom_mnoz4()
{
	mnoz4 = new Thread(this);
	mnoz4.start();
}

public void run()
{

for( i=x3;i<x4;i++)
{for( j=0;j<N; j++)
{C[i][j]=0;
for (k=0;k<N;k++)
{ C[i][j]+=A[i][k]*B[k][j];
}
System.out.print(C[i][j]+"\t");
}
System.out.print("\n");
}
}
}

class wyswietl extends mnozenie1
{
void wyswietl()
{

System.out.print(C[i][j]);
}

}

public class ostateczny_1
{ static int i,j,x1,x2,x3,x4,d,k;
static String s;
static int N;
static int [][]A;
static int [][]B;
static int [][]C;

//określanie wielkości macierzy

static void wypelnij()
{
s=JOptionPane.showInputDialog(null,"Podaj wymiar macierzy");
N=Integer.parseInt(s);
A = new int [N][N];
B = new int [N][N];
C = new int [N][N];
d=N/4;
x1=d;
x2=2d;
x3=3
d;
x4=N;

   	System.out.println(x1);
   	System.out.println(x2);
   	System.out.println(x3);
   	System.out.println(x4);

System.out.print("Macierz A\n");	   	
for (i=0;i<N;i++)
{
	for(j=0;j<N;j++)
	{
	A[i][j]=(int)(Math.random()*65);
	System.out.print(A[i][j]+"\t");
}
System.out.print("\n");
}
System.out.print("Macierz B\n");
for (i=0;i<N;i++)
{
	for(j=0;j<N;j++)
	{ 
	B[i][j]=(int)(Math.random()*65);
	System.out.print(B[i][j]+"\t");
}
System.out.print("\n");
}
}

public static void main (String args[])
{
wypelnij();
mnozenie1 iloczyn1= new mnozenie1();
mnozenie2 iloczyn2= new mnozenie2();
mnozenie3 iloczyn3= new mnozenie3();
mnozenie4 iloczyn4= new mnozenie4();
iloczyn1.uruchom_mnoz1();
iloczyn2.uruchom_mnoz2();
iloczyn3.uruchom_mnoz3();
iloczyn4.uruchom_mnoz4();
}
}

0

Po pierwsze - kod jest nie czytelny jak k.... m.., wiec jak sobie wyobrazasz ze dostrzezesz jakis blad, a analiza takiego kodu to 13 praca Herkulesa :/
popracuj nad przjezystoscia to bedzie ci łatwiej i innym ktorym podrzucisz kod, wbrew pozora ma to znaczenie.

Po drugie - po co ci az definiowanie az 4 klas robiacych dokladnie to samo tylko na innych kolumnach. Zdefinuj jedna klase i dostarcz do niej parametry odkad i dokond ma liczyc i wstaw do pierwszej instrukcji for w metodzie run

Po trzecie - do czego ma sluzyc klasa wyswietl, nie widze jej zastosowan ani teraz ani puzniej

No i wkoncu punkt w ktorym jest blad a jest naprawde banalny :).
spojrz gdzie umiesciles wyswietlanie tablicy C, to ze do 8 wyswietla sie "poprawinie" to kwestja przypadku. Uruchomiles 4 watki ktore obliczaja jedna liczbe i Od razu ja wyswietlaja, a kazdy watek musi co jakis czas oddac proca innemu watkowi ktory tez formatuje tekst na konsoli wg swojego uznania, czyli wyswietlan C[i][j] z tabulatrem az do N-1 a pozniej pisz do nowej lini, wracajac do "poprawinei to sprawdzilbym czy dla mniejszych liczb N wysietla je tam gdzie powinien bo szczerze watpie a nie sprawdzalem i juz nie bede tego robil
Ok wiec tak, wywal System.out.println'y z watków to bedzie dobrze bo bledow w obliczaniach nie zauwazyłem. Zaraz za wywolanieu wszystkich watkow wyswietl sobie tablice C Tylko nie Od razu bo tam nie ma jej w całości jeszcze dopiero sie tworzy w watkach wiec zrob jakiegos delay'a tak by watki skonczyly tworzyc tablice C

A tak w ogóle to po co to piszesz bo praktycznych zastosowani nie widze, po za zdobywaniem praktyki.
Rozwiazalem twoj problem i zmierzylme czasy mnozenia w 4 watkach i w sposob jaki napisalem w poscie wyzej i watki sa znacznie dluzsze( przy N =8 wynosilo to nawet 80 razy :/ , przy wyzszych N np 1000 na watki czekalem 52 sek na watki i 42 sek na klasyka a przy 10000 bylo juz outOfMemory :/)

do pioniera:
to ze bartke zadeklarowal to jako zmienne klasowe to slusznie zrobil bo powinien miec dostep do nic z całej klasy
zmienne te nie sa tez publiczne, tylko tak zwane zaprzyjaznione, publiczne sa ze specyfikatorem public
inicujac je lokalnie tez dorze zrobil, gc uruchomi sie ale ich nie tknie tylko usunie te wczesniej zainicjalizowane a te dostepne pod zmiennymi A B C beda nadal dostepne z calej klasy taki stan rzeczy jest dzieki temu ze java operuje na referencjach a nie na zmiennych

Pozdrawiam BookaYashee

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