logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Java] Macierze. Wprowadzanie danych. Automatyczne generowanie.

Poczatkujacy7 21 Lis 2006 19:20 14306 5
REKLAMA
  • #1 3248256
    Poczatkujacy7
    Poziom 2  
    Posty: 4
    Jestem poczatkujacy w tym temacie, wiec prosze o wyrozumialosc; )

    Pisze w NetBeans 5.5
    Na poczatek chodziloby mi o samo tworzenie i wypisywanie macierzy. W bolach 'urodzilem'; ) cos takiego:

    Macierz.java
    
    public class Macierz {
        int kolumny;
        int wiersze;
        int wartosc;
        int[][] tab;
        
        public Macierz(int kolumny, int wiersze) {
            this.kolumny=kolumny;
            this.wiersze=wiersze;
        }
        public int[][] utworz(){
            this.tab=new int[this.kolumny][this.wiersze];
            for(int i=0;i<this.kolumny;i++)
                for(int j=0;j<this.wiersze;j++){
                this.tab[i][j]=wartosc;
                }
                return this.tab;            
        }
        public void wypisz(){
            System.out.println("Macierz: ");
            for(int i=0;i<this.tab.length;i++){
                for(int j=0;j<tab[i].length;j++){
                        System.out.print(tab[i][j]);
            }
                System.out.println();
        }
        
        
    }
    
    


    Main.java
    
    
    public class Main {
        
    
        public Main() {
        }
        
    
        public static void main(String[] args) {
           System.out.println("Macierz m1: \n");
           Macierz m1=new Macierz(2,3);
           m1.utworz();
           m1.wypisz();
           System.out.println("Macierz m2: \n");
           Macierz m2=new Macierz(3,4);
           m2.utworz();
           m2.wypisz();
           int[][] m3 = { {3, 4, 5 }, { 1, 4, 5 },{ 1, 2, 3},};
    		
           System.out.println("Macierz m3: ");
    		for (int i = 0; i < m3.length; i++) {
    			for (int j = 0; j < m3[i].length; j++) {
    				System.out.print(m3[i][j] + " ");
    			}
    			System.out.println();
    		}	
         
        }
       
    }
    


    I o dziwo; ) to dziala, tylko tworzy macierze-m1, m2 samych zer... W zwiazku z tym dopisalem macierz m3 i tam podaje 'recznie' cala macierz...

    Moze ktos moglby pomoc, aby uzytkownik wprowadzal elementy do macierzy podczas wykonywania programu albo zeby program generowal losowa macierz niezerowa badz takie wprowadzanie jak zrobilem w macierzy m3, ale zeby bylo to jako metoda klasy...

    Oczywiscie jakiekolwiek uwagi do tego co juz napisalem mile widziane; )
  • REKLAMA
  • #2 3248597
    Łuk_F
    Poziom 17  
    Posty: 257
    Pomógł: 34
    Ocena: 12
    W klasie Macierz masz pole int wartosc; i ma wartość 0 i tymi zerami uzupełniasz tablice.

    Uzupełnianie losowymi wartościami <0,100):

    public int[][] utworz(){ 
            this.tab=new int[this.kolumny][this.wiersze]; 
            for(int i=0;i<this.kolumny;i++) 
                for(int j=0;j<this.wiersze;j++){ 
                this.tab[i][j]=(int) Match.random()*100; 
                } 
                return this.tab;  
  • REKLAMA
  • REKLAMA
  • #4 3285018
    Poczatkujacy7
    Poziom 2  
    Posty: 4
    A moze ktos wie bedzie potrafil znalezc tutaj blad: / 'Proste' mnozenie a jednak cos jest zle: /
    
    public void pomnoz(Macierz A, Macierz B){
            System.out.println("Macierze po pomnozeniu: ");
            for(int i=0;i<this.kolumny;i++){
                for(int j=0;j<this.wiersze;i++){
                    this.tab[i][j]=0;
                    for(int k=0;i<A.kolumny;i++)
                    for(int w=0;j<B.wiersze;j++){
                    this.tab[i][j] += A.tab[k][j] * B.tab[i][w];
                    }
                }       
           }
    }


    a oto przykladowy wynik: /
    Macierz A:
    6 6 6
    3 1 7
    3 8 7
    Macierz B:
    2 3 6
    5 4 4
    8 5 0
    Macierze po pomnozeniu:
    12 19 13
    1 2 5
    3 1 4
  • REKLAMA
  • #5 3286085
    Łuk_F
    Poziom 17  
    Posty: 257
    Pomógł: 34
    Ocena: 12
    W pętlach inkrementujesz złe zmienne oraz źle jest napisana ostatnia petla.

    public void pomnoz(Macierz A, Macierz B){ 
            System.out.println("Macierze po pomnozeniu: "); 
            for(int i=0;i<this.kolumny;i++){ 
                for(int j=0;j<this.wiersze;j++){ 
                    this.tab[i][j]=0; 
                    for(int k=0, int w=0;i<A.kolumny;k++, w++) { 
                    this.tab[i][j] += A.tab[k][j] * B.tab[i][w]; 
                    } 
                }        
           } 
    }


    Ten kod powinien byc dobry.
  • #6 3290567
    Poczatkujacy7
    Poziom 2  
    Posty: 4
    Kompiluje sie, ale podczas uruchamiania wywala sie taki blad: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
    I napewno nie powinno sie jeszcze sprawdzac warunku wierszy drugiej macierzy? Wydaje mi sie, ze mnozenie macierzy jest mozliwe kiedy ilosc kolumn pierwszej rowna sie ilosc wierszy drugiej...


    Ok, juz sobie poradzilem... A teraz jeszcze sprawa, ktora ciezko bedzie mi samemu wymyslic, wiec jesli ktos moze poratowac podpowiedzia i/lub kawalkiem kodu dotyczacego jak policzyc macierz odwrotna i/lub rzad macierzy to bylbym wdzieczny naturalnie. Do odwrotnej potrzebny jest wyznacznik, ktory napisalem-narazie tylko dla macierzy 2x2 i 3x3, ale narazie wystarczy;)
REKLAMA