Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem JAVA prohození matice podle vedlejší diagonály

Zdravím, potřeboval bych poradit s jedním programem

Zadání:
1. Vygeneruje do celého dvojrozměrného pole o rozměru 5 x 5 (tj. matici) náhodná čísla z <-100,100>
2. Vypíše na konzoli matici v podobě pravidelně naformátované tabulky
3. Dále vypíše matici

A
kdy budou prohozené prvky podle hlavní diagonály

B
kdy budou prohozené prvky podle vedlejší diagonály.

Vypracované A:

public class program {

    int a = 5;
    int b = 5;
    int pole[][] = new int[a][b];

    void vygenerujPole() {
        for (int i = 0; i < pole.length; i++) {
            for (int j = 0; j < pole.length; j++) {
                pole[i][j] = (int) (-100 + Math.random() * 200);
            }
        }
    }

    void vypsatPole1() {
        for (int i = 0; i < pole.length; i++) {
            for (int j = 0; j < pole.length; j++) {
                System.out.printf("% 5d", pole[i][j]);
                if (j == (a - 1)) {
                    System.out.println("");
                }
            }
        }
    }

    void vypsatPole2() {
        System.out.println("");
        for (int i = 0; i < pole.length; i++) {
            for (int j = 0; j < pole.length; j++) {
                System.out.printf("% 5d", pole[i][j]);
                if (j == (a - 1)) {
                    System.out.println("");
                }
            }
        }
    }

    void prohoditPole() {
        int pom;
        for (int i = 0; i < pole.length; i++) {
            for (int j = i; j < pole.length; j++) {
                pom = pole[i][j];
                pole[i][j] = pole[j][i];
                pole[j][i] = pom;

            }
        }
    }
public static void main(String[] args) {
        program z = new program();

        
        System.out.println("Prohození podle hlavní diagonály");
        z.vygenerujPole();
        z.vypsatPole1();
        z.prohoditPole();
        z.vypsatPole2();
}

A nemůžu přijít na řešení B. Pokud mám naprogramováno B, místo A, tak se omlouvám, strávil jsem nad tím půl dne a už z toho magořím.

Děkuji

Předmět Autor Datum
Jsem trošku zmaten - pokud chceš komunikovat s dívkou a nechces aby komunikaci ukoncila, tak je dobr…
AZOR 06.05.2012 20:13
AZOR
Jinak bych si zavolal tu funkci vypsani v tom prohazovani, pokud to Tam nevidis: void prohoditPole…
AZOR 06.05.2012 20:15
AZOR
takže se mu pole.length * pole.length (5*5) krát vypíše matice s jaksi prohazenymi prvky. To bude už…
Migilenik 07.05.2012 07:58
Migilenik
Máš na začátku zadání rozdělený na A a B. Napsal jsem, že mám A naprogramovaný, a že bych potřeboval…
Nallim 06.05.2012 20:51
Nallim
si to predsa nakresli na papier a uvidis jak sa to robi. Ked to vies urobit rukou tak to vies aj nap…
MM.. 06.05.2012 20:15
MM..
... aha hehe mam tam chybu takze som ti nepoveedal vsetko :) Na tu chybu ale prid sam :)
MM.. 06.05.2012 20:16
MM..
Už to mám, děkuji. :)
Nallim 06.05.2012 20:51
Nallim
:-D vubec nevim o co Ti slo, ale znacim to tedy jako vyresene..
AZOR 06.05.2012 21:03
AZOR
Mohl by jsi sem dát řešení?
mr 07.05.2012 00:02
mr
Můžu se zeptat, co přesně má znamenat kdy budou prohozené prvky podle hlavní/vedlejší diagonály ?…
Migilenik 07.05.2012 07:47
Migilenik
proč tam máš dvakrát tu samou metodu?? To by mi zajimalo jakym zpusobem si pri tom poradi java pře…
AZOR 07.05.2012 12:10
AZOR
Myslim ze todle nijak osetřeny neni a prostě to bude překladat presne tak jak to je napsany, celej k…
Migilenik 07.05.2012 12:29
Migilenik
Neměl bys prosím algoritmus na to samý akorát podle vedlejší diagonály? Díky moc
mr 07.05.2012 15:01
mr
EDIT: Ta metoda prohodPole provadi transponovani matice (vymenu radku za sloupce) Transponovani !=…
Migilenik 07.05.2012 15:15
Migilenik
nallim pisal ze "Už to mám, děkuji. :)" Ty si zas kto? Preco by sme sem mali davat riesenia uplne pr…
MM.. 07.05.2012 15:32
MM..
domácí úkol nebo by to mohla být ještě bakalářka na VŠE :-p
AZOR 07.05.2012 15:36
AZOR
:-D Nekřivdíš jim trochu?
Migilenik 07.05.2012 15:37
Migilenik
samozřejmě že je to hrozná křivda, ale nedalo se to nenapsat :-D
AZOR 07.05.2012 15:40
AZOR
to asi nie ptz nechapem prakticky vyznam takeho prehadzovania prvkov "podla diagonaly" takze to skor…
MM.. 07.05.2012 16:02
MM..
Ak myslis prohozeni prvku nad HD/VD za prvky pod HD/VD tak se shodnem, ted me to taky napadlo.
Migilenik 07.05.2012 16:06
Migilenik
Ano přesně tak to je, sice je transponovaná matice, ale když se kouknete na prvky nad hl. diagonálou…
mr 07.05.2012 16:13
mr
Co je nepochopitelne na si to predsa nakresli na papier a uvidis jak sa to robi. Ked to vies urobit…
MM.. 07.05.2012 16:25
MM..
To jsem zase narazil na lidi ochotný
mr 07.05.2012 16:30
mr
Viac ochotny byt clovek nemoze. Napisat kod neni ochota ptz potom zostanes blby, a to ochotny clovek…
MM.. 07.05.2012 16:32
MM..
chjo, tak zostan blby, mne je to fuk int pom = pole[i][j]; pole[i][j] = pole[pole.length-1-i][pole.…
MM.. 07.05.2012 16:35
MM..
a nie hovadina (nechcelo sa mi to kreslit si) takto by to bmalo byt (si to preistotu over na papieri…
MM.. 07.05.2012 16:37
MM..
Nechci ti do toh kecat ale jaksi to nefunguje
mr 07.05.2012 16:48
mr
void transponujPodleVD() { for (int j = 0; j < pole.length; j++) { for (int i = 0; i < pole.length-j…
Migilenik 07.05.2012 16:51
Migilenik
MM ne Tank ale jako Mnichov- MM.. a Tank jsou jiní lidé - tenhle nemá bžilion cm ani bžilion kg jako…
AZOR 07.05.2012 17:20
AZOR
MM je skratka mena a 2bodky su tam preto lebo min nick je 4znaky :) MM tank je typ tanku z nejakej z…
MM.. 07.05.2012 17:36
MM..
jaksi na tom nefunguje co konkretne? Ze ty tam pises pismeno l namiesto cislice 1? Copy paste vas ti…
MM.. 07.05.2012 17:38
MM..
Neřeš to, ty seš nejchytřejší ja sem debil:-)
mr 07.05.2012 18:35
mr
ja som nikde nenapisal ze si debil, ale ze ked sa nebudes snazit to pochopit ale budes len opisovat…
MM.. 07.05.2012 18:47
MM..
Ale já jsem se snažil, na HL. diagonalu jsme přišel, a spoustu jinejch veci proste tohle me netrklo…
mr 07.05.2012 18:49
mr
Boze ludia dajte si do google hlavni vedlejsi diagonala matice. Je to hned prvy vysledok google, na…
MM.. 07.05.2012 15:30
MM..
To, co tu máš má jednu "malou" vadu na kráse, a to sice tu, že to bude fungovat jen pro čtvercové ma…
MaSo 07.05.2012 19:05
MaSo
definuj "diagonalu" na obdlznikovej matici.
MM.. 07.05.2012 19:07
MM..
Šlo mi hlavně o ty metody pro výpis...:-) http://cs.wikipedia.org/wiki/Matice#Diagon.C3.A1la _matic…
MaSo 07.05.2012 19:10
MaSo
No definuj mi diagonalu obdlznikovej matice. To akoze bude koncit niekde na hrane a nie v rohu? To p…
MM.. 07.05.2012 19:13
MM..
Diagonála matice A, je tvořena prvky A[i,j], kde i=j...:-P:-)
MaSo 07.05.2012 19:15
MaSo
no tak by u obdlznika koncila na hrane, to je diagonala jak svina.
MM.. 07.05.2012 19:15
MM..
jaj aha metody pro vypis, no metody pro vypis su nahovno to som videl hned ale to neriesim ked to ne…
MM.. 07.05.2012 19:14
MM..
Tak jenom pro jistotu: void vypsatPole1() { for (int i = 0; i < pole.length; i++) { for (int j = 0…
MaSo 07.05.2012 19:17
MaSo
to odřádkování je epický no.
Migilenik 07.05.2012 19:26
Migilenik
Náhodou tušil by někdo jak prohodit prvky pod hl. diagonálou mezi 2 maticema? prvky pod hl. diagonál…
xyzxyz 09.05.2012 23:19
xyzxyz
int pom = pole1[i][j]; pole1[i][j] = pole2[i][j]; pole2[i][j] = pom;
MM.. 10.05.2012 00:41
MM..
Měl jsem udělat řazení matice podle posledního řádku. Tedy že největší prvek v posl. řádku bude prvn… poslední
xyzxyz 22.05.2012 09:22
xyzxyz

Jsem trošku zmaten - pokud chceš komunikovat s dívkou a nechces aby komunikaci ukoncila, tak je dobré pokazdé uvéci alespon jednu větu s otazníkem a nechat otevřenou otázku ;) A tak tomu platí i u otázek - přiznám se, že nerozumím tomu, co potřebuješ (zatímco kodu rozumím)

Jinak bych si zavolal tu funkci vypsani v tom prohazovani, pokud to Tam nevidis:

 void prohoditPole() {
        int pom;
        for (int i = 0; i < pole.length; i++) {
            for (int j = i; j < pole.length; j++) {
                pom = pole[i][j];
                pole[i][j] = pole[j][i];
                pole[j][i] = pom;
                vypsatPole1(); /* NOVINKA V KODU */

            }
        }
    }

si to predsa nakresli na papier a uvidis jak sa to robi. Ked to vies urobit rukou tak to vies aj naprogramovat bez toho aby si sa niekoho pytal.
Zistis ze chces [0,0] vymenit za [velkost,velkost], [1,1] za [velkost-1,velkost-1], apod. Toto som ti uz nemal pisat, mas vlastny rozum.

Můžu se zeptat, co přesně má znamenat

kdy budou prohozené prvky podle hlavní/vedlejší diagonály

?

Prvky v řádcích, ve sloupcích, všechny? Ta první metoda je klasický výpis, ta druhá taky (BTW proč tam máš dvakrát tu samou metodu?? Vždyt přeci vygeneruješ matici, na tu zavolas vypis, pak ji tou metodou prohodPole nejak modifikujes a pak na tu modifikovanou staci zavolat ten samej vypis) a ta třetí na to prohazování (co vypadá jako nekompletní bubblesort) neudělá ani jedno z toho.

Myslim ze todle nijak osetřeny neni a prostě to bude překladat presne tak jak to je napsany, celej kod výše se da sbouchnout na polovinu. Zhruba takhle:

import java.util.Random;

public class Program {
    Random rd = new Random();
    int pole[][] = new int[5][5];

    void vygenerujPole() {
        for (int i = 0; i < pole.length; i++) {
            for (int j = 0; j < pole.length; j++) {
                pole[i][j] = rd.nextInt(11); //generuje jen od 0 do 10
              //pole[i][j] = -100 + rd.nextInt(201); //generovani v intervalu <-100,100>
              //pole[i][j] = min + generator(max - min +1);
            }
        }
    }
    
    void vypisPole(){
	for (int i = 0; i < pole.length; i++){
	    for (int prvek: pole[i]) System.out.printf("% 5d", prvek);//for-each cyklus
            //vypsani každeho řadku jako pole(matice je pole polí -> každý řádek je pole)
	    System.out.println(""); //odřadkovani za každym řadkem matice
	}
	System.out.println(""); //odřadkovani za matici
    }

    void prohoditPole() {
        for (int i = 0; i < pole.length; i++) {
            for (int j = i; j < pole.length; j++) {
                int pom = pole[i][j];
                pole[i][j] = pole[j][i];
                pole[j][i] = pom;
            }
        }
    }

    public static void main(String[] args) {
	Program matice = new Program();
	
        matice.vygenerujPole();
	matice.vypisPole();
	
	System.out.println("Prohození podle hlavní diagonály");
		
	matice.prohoditPole();
	matice.vypisPole();
    }
}

BTW Nic to ale neměni na tom, že ta metoda prohodPole() tak, jak je napsana tazatelem, v podstate nic nedela.

to asi nie ptz nechapem prakticky vyznam takeho prehadzovania prvkov "podla diagonaly" takze to skor bude len nejake cvicenie na domacu ulohu (a ano neni uplne jasne ze co sa ma vlastne prehadzovat, ale zrejme sa mysli zrkadlenie celej matice podla diagonaly, tak to aspon chapem ja tu "ulohu").

Ano přesně tak to je, sice je transponovaná matice, ale když se kouknete na prvky nad hl. diagonálou tak po provedení algoritmu jsou pod hl. diagonálou a naopak. Chtěl bych totéž pro vedlejší diagonálu. Když je to pro Vás tak jednoduché ocenil bych kdyby sem někdo napsal ten algoritmus(max. 5 řádků podle mě). Mám to na zkoušku a bohužel už jsem z toho tak blbej že to nevymyslim. Děkuji

Co je nepochopitelne na

si to predsa nakresli na papier a uvidis jak sa to robi. Ked to vies urobit rukou tak to vies aj naprogramovat bez toho aby si sa niekoho pytal.
Zistis ze chces [0,0] vymenit za [velkost,velkost], [1,1] za [velkost-1,velkost-1], apod. Toto som ti uz nemal pisat, mas vlastny rozum.

je v tom mala chyba a schavlne nenapisem v com, to by si mal vidiet sam. Ked to nezvladnes tak by si tu skusku urobit nemal, vo vlastnom zaujme :)

void transponujPodleVD() {
    for (int j = 0; j < pole.length; j++) {
        for (int i = 0; i < pole.length-j; i++) {
            int pom = pole[i][j];
            pole[i][j] = pole[pole.length-1-j][pole.length-1-i];
            pole[pole.length-1-j][pole.length-1-i] = pom;
        }
    }  
}

Edit:Nechci ti do toho kecat, ale kdyz uz si od MM.. dostal zdarma tu vymenu, tak si mohl samostatne vypotit ten index, do ktereho muzes tu matici prochazet. Jak uz bylo psano, staci si to napsat na papir.

Edit2: MM.., proc me pri cteni vaseho nicku vzdycky napadne MM..Tank?
Edit3: Case Solved -> pivni_MM_Tank

Náhodou tušil by někdo jak prohodit prvky pod hl. diagonálou mezi 2 maticema? prvky pod hl. diagonálou jsou i=1 až do poctuRadku a sloupce jsou i=0 až do i-1, akorát netuším jak udělat tu výměnu. Děkuji za krátký návod jak to udělat

Měl jsem udělat řazení matice podle posledního řádku. Tedy že největší prvek v posl. řádku bude první, a takhle sestupně nebo vzestupně. Udělal jsem to takhle, nešlo by to nějak jednosušejc?
public void serad(boolean vzestupne, int rozmer) {

int pocet = ((rozmer * rozmer) - rozmer) / 2;
int[] arrNad = new int[pocet];
int[] arrPod = new int[pocet];
int pNad = 0, pPod = 0;

for(int x = 0; x < rozmer; x++) {
for(int y = 0; y < rozmer; y++) {
if (y > x) {
arrNad[pNad++] = matice[x][y];
} else if (x > y) {
arrPod[pPod++] = matice[x][y];
}
}
}

sort(arrNad, vzestupne);
sort(arrPod, !vzestupne);

pNad = 0; pPod = 0;
for(int x = 0; x < rozmer; x++) {
for(int y = 0; y < rozmer; y++) {
if (y > x) {
matice[x][y] = arrNad[pNad++];
} else if (x > y) {
matice[x][y] = arrPod[pPod++];
}
}
}

}

private void sort(int[] array, boolean vzestupne) {
//TODO nějaká implementace sortingu

Arrays.sort(array);
if (!vzestupne) {
for (int left = 0, right = array.length - 1; left < right; left++, right--) {
int temp = array[left];
array[left] = array[right];
array[right] = temp;
}
}
}

Zpět do poradny Odpovědět na původní otázku Nahoru