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:prawie 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:minuta
  • Lokalizacja:Laska, z Polski
  • Postów:10063
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:prawie 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
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)