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
To, co tu máš má jednu "malou" vadu na kráse, a to sice tu, že to bude fungovat jen pro čtvercové matice...
definuj "diagonalu" na obdlznikovej matici.
Šlo mi hlavně o ty metody pro výpis...
http://cs.wikipedia.org/wiki/Matice#Diagon.C3.A1la _matice
Nikde nevidím, že by musela být čtvercová...
jaj aha metody pro vypis, no metody pro vypis su nahovno to som videl hned ale to neriesim ked to netrapi autora :) Ano metody pre vypis nie su (vseobecne) korektne
Tak jenom pro jistotu:
to odřádkování je epický no.
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
int pom = pole1[i][j];
pole1[i][j] = pole2[i][j];
pole2[i][j] = pom;
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;
}
}
}