Transpozycja tablicy kwadratowej.

Transpozycja tablicy kwadratowej.
NU
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad 3 lata
  • Postów:3
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ś:

Kopiuj
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ę.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
.andy
  • Rejestracja:ponad 16 lat
  • Ostatnio:około 3 lata
  • Postów:1524
0

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

Kopiuj
    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:

Kopiuj
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
Kopiuj
is sqr: true
is sqr: false

Software is like sex: it's better when it's free.
- Linus Torvalds
edytowany 4x, ostatnio: .andy
Zobacz pozostałe 2 komentarze
Riddle
@.andy: Tak. Chociaż Tobie w tym przykładzie chyba chodziło o array.length == array[0].length, prawda? ;)
.andy
@TomRiddle: odpisałem w poście. Ogólnie to trzeba operować na macierzy dwuwymiarowej.
Charles_Ray
Od kiedy tablica 2x3 jest macierzą kwadratowa? Musiałem bardzo nie uważać na studiach
.andy
ehhh...tak to jest jak się pisze na szybko i nie patrzy co się napisało :P No dałem d**y teraz :P
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Laska, z Polski
  • Postów:10077
2
.andy napisał(a):
Kopiuj
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
Kopiuj
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.

edytowany 4x, ostatnio: Riddle
NU
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad 3 lata
  • Postów:3
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:

Kopiuj
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.

Charles_Ray
A to nie jest tak, ze sobie zamieniasz a potem zamieniasz jeszcze raz? Dodaj warunek if (i<j), żeby przejść tylko jeden „trojkat”
NU
Ohh.. słuszna uwaga. Teraz działa prawidłowo. Dziękuję za pomoc.
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.