Transpozycja tablicy kwadratowej.

0

Witam,
od niedawna uczę się programować w Javie i dostałem kilka zadań, wśród których jest jedno o wspomnianej w tytule Transpozycji tablicy. Zadanie to polega na tym, że trzeba napisać funkcję sprawdzającą czy podana tablica jest kwadratowa i jeśli tak, to wykonującą transpozycję tej tablicy, a jeśli nie to zwracającą null.
Polecenie brzmi tak: Napisz funkcję, która wykonuje transpozycję tablicy metodą przestawiania elementów wewnątrz tablicy (bez tworzenia dodatkowej tablicy), tablica musi być kwadratowa, jeżeli nie spełnia tego warunku wartością funkcji jest null.
Szukałem jakichś rozwiązań w internecie, lecz nic nie znalazłem. Próbowałem też pisać sam, ale co bym nie zrobił, ciągle wychodzi źle.
Jedyne co do tej pory napisałem to takie coś:

public static int[][] transponujTablice2(int[][] t, int rozmiar1, int rozmiar2) {

        if (rozmiar1 >= 2 && rozmiar2 >= 2) {
            for (int i = 0; i < t.length; i++) {
                for (int j = 0; j < t[i].length; j++) {
                    t[i][j] = t[j][i];
                }
            }
            return t;
        }
        return null;
    }

Problem tkwi w tym, że to nie działa i sam jestem świadomy dlaczego, lecz to jedyny mój pomysł i taki "punkt zaczepienia", od którego nie wiem jak pójść dalej. Nie jestem po prostu w stanie tego naprawić ani wykombinować nic sensownego. Dlatego też proszę o pomoc i ze względu na to, że dopiero zaczynam naukę Javy, "łopatologiczne" wytłumaczenie czemu musi być tak, a nie inaczej. Za wszelką pomoc z góry dziękuję.

0
  1. Umiesz dokonać transpozycji tabeli na kartce? Potrafisz nam tu opisać w jaki sposób byś to zrobił? Weź do ręki ołówek i gumkę i spróbuj wykonać taką operacje.
  2. if (rozmiar1 >= 2 && rozmiar2 >= 2) { ten warunek nie ma absolutnie żadnego sensu. Zapewniam cie że tablica 3x3 też jest kwadratowa. I 4x4 też. Nie wiem też za bardzo po co ci te argumenty rozmiar1 i rozmiar2, bo tablice w javie maja length
  3. t[i][j] = t[j][i]; świetny plan, tylko w ten sposób właśnie bezpowrotnie zgubiłeś poprzednią wartość t[i][j] bo ją nadpisałeś i nigdzie nie zapamiętałeś. Przecież ty chcesz ZAMIENIĆ te elementy miejscami, a tutaj nadpisujesz jeden z nich wartością drugiego. Jeszcze raz: weź kartkę papieru do ręki i zrób to na kartce ręcznie.
0

Sprawdzenie czy tablica dwuwymiarowa jest kwadratowa można zrobić np. tak:

    boolean isSquarArray(int[][] array){
        return array[0].length == array[1].length;
    }

Transponowanie robi się tak, ze kolumna przechodzi w wiersz:
Tablica:
1 | 2 | 3
4 | 5 | 6
7 | 8 | 9
Transponowana:
1 | 4 | 7
2 | 5 | 8
3 | 6 | 9

@TomRiddle odpiszę tutaj:

import java.util.*;
import java.lang.*;
import java.io.*;

// The main method must be in a class named "Main".
class Main {
    public static void main(String[] args) {
        
        int[][] sqrArray = {{1,2,3},{4,5,6}};
        int[][] notSqrArray = {{1,2,3},{4,5,6,7}};
        System.out.println("is sqr: " + isSquarArray(sqrArray));
        System.out.println("is sqr: " + isSquarArray(notSqrArray));
    }
    
    static boolean isSquarArray(int[][] array){
        return array[0].length == array[1].length;
    }
}
https://www.mycompiler.io/new/java
is sqr: true
is sqr: false
2
.andy napisał(a):
import java.util.*;
import java.lang.*;
import java.io.*;

// The main method must be in a class named "Main".
class Main {
    public static void main(String[] args) {
        
        int[][] sqrArray = {{1,2,3},{4,5,6}};
        int[][] notSqrArray = {{1,2,3},{4,5,6,7}};
        System.out.println("is sqr: " + isSquarArray(sqrArray));
        System.out.println("is sqr: " + isSquarArray(notSqrArray));
    }
    
    static boolean isSquarArray(int[][] array){
        return array[0].length == array[1].length;
    }
}
https://www.mycompiler.io/new/java
is sqr: true
is sqr: false

Jeśli tak wyglądają Twoje testy jednostkowe, to nie sądzę że potrafią wykrywać bugi. Wygląda jakbyś tylko sprawdzał Happy Path.

Sprawdź ten array Twoją funkcją: new int[][]{new int[]{0,1,2}, new int[]{0,1,2}, new int[]{0,1}}.
Albo taki: new int[][] { new int[]{}, new int[]{} }, prostokąt 2x0, przechodzi Twoją funkcję ;D

Twoja funkcja sprawdza tak na prawdę czy dwa pierwsze wiersze mają taką samą długość, ale to

A) nie sprawdza czy pozostałe wiersze mają taką samą długość.
B) nie sprawdza czy szerokość jest równa długości. Więc np prostokąt 3x4 również by przeszedł Twoją funkcję.

PS: Swoją drogą, szkoda że nawet kiedy ktoś Ci zwrócił na to uwagę, nadal obstawiasz przy swoim. Jeśli chciałbyś kontynuować pracę w programowaniu, sugerowałbym Ci żebyś był bardziej samokrytyczny co do swoich rozwiązań. Pozwoli Ci to znaleźć i naprawić więcej błędów.

0

@Shalom: Transpozycję rozumiem jako zamianę wierszy z kolumnami. Czyli mając np:
1 2 3
4 5 6
7 8 9
po transpozycji powinno być:
1 4 7
2 5 8
3 6 9
Problemem jest raczej sposób w jaki to wykonać w programie bo jednak wygląda to inaczej niż na kartce.
Ten warunek, o którym wspomniałeś jest tam dlatego, że rozmiary tablicy mają być podawane przez użytkownika i niekoniecznie będą takie same, bo można podać 2x3, 3x4 albo równie dobrze 1x0, czy też coś podobnego, a wpisując dla któregokolwiek z tych rozmiarów 1, 0 albo jakąś liczbę ujemną wyskakiwał mi jakiś błąd, więc uznałem, że dobrze by było jakbym po prostu pozbył się go w jakiś sposób. No i pierwszą myślą jaka mi do głowy przyszła było właśnie coś takiego jak widać wyżej. Bardzo możliwe, że trochę przekombinować próbowałem, no ale jestem osobą początkującą, więc dziękuję za uwagę i spróbuję coś z tym zrobić.
A co do ostatniej uwagi - sposób działania transpozycji rozumiem tak jak napisałem wyżej i pokazałem na przykładzie. Problem tkwi w tym, że nie wiem jak przenieść całą ideę do Javy, no a to co wysłałem jest tak jak wspomniałem "punktem zaczepienia" bo nie wiedziałem co dalej.
Póki co ( pomijając rozmiar1 i rozmiar2 oraz ten warunek, w if, bo to akurat mniej ważne, a priorytetem jest działanie transpozycji ) próbowałem zmienić wnętrze drugiego fora na coś bardziej sensownego i wyszło coś takiego:

public static int[][] transponujTablice(int[][] t, int rozmiar1, int rozmiar2) {

        if (rozmiar1 >= 2 && rozmiar2 >= 2) {
            for (int i = 0; i < t.length; i++) {
                for (int j = 0; j < t[i].length; j++) {
                    int pomocnicza = t[i][j];
                    t[i][j] = t[j][i];
                    t[j][i] = pomocnicza;
                }
            }
            return t;
        }
        return null;
    }

Ale dosłownie nic to nie robi, bo jak miałem np.
1 2 3
4 5 6
7 8 9
tak dalej mam to samo.

0

bo jednak wygląda to inaczej niż na kartce.

bzdura.

Ten warunek, o którym wspomniałeś jest tam dlatego, że rozmiary tablicy mają być podawane przez użytkownika

Po pierwsze ten warunek nie miał żadnego sensu, bo sprawdzał tylko czy podane wymiary są >=2 co z kwadratowością nie ma żadnego związku. Dodatkowo array w javie to obiekt i zna swoje rozmiary.

Ale dosłownie nic to nie robi

Jeszcze raz: WEŹ DO RĘKI KARTKĘ I WYKONAJ TEN ALGORYTM NA KARTCE. SERIO! Bardzo szybko rozumiesz gdzie jest problem... Bo teraz robisz jakieś permutation driven development i zmieniasz losowe fragmenty kodu zamiast spróbować zrozumieć algorytm według którego działa kod.

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