Artur 57 wyśw. 06-07-2025 23:02

Praca domowa 3 zad 6

6. Napisz program, w którym stworzona zostanie tablica o rozmiarze określonym przez argument
przekazany do programu w trakcie jego uruchamiania. Jeśli rozmiar tablicy będzie liczbą nieparzystą,
to środkowy element tablicy ma być zerem, natomiast kolejne elementy mają być zwiększane o 1. Tak
samo idąc w stronę mniejszych indeksów tablicy, jej sąsiednie elementy mają być zwiększane o 1
(patrz przykładowy wynik). Jeśli rozmiar tablicy będzie liczbą parzystą, to dwa środkowe elementy
tablicy mają być zerami, natomiast w co do pozostałych elementów tablicy, to sytuacja ma być
analogiczna jak dla przypadku z nieparzystą liczbą elementów. Program ma wypisać na ekran
zawartość tablicy ponownie wykorzystując pętlę for-each.
Przykładowy wynik działania programu dla argumentu na wejściu: 17
Wybrany rozmiar tablicy: 17
Tablica: 8 7 6 5 4 3 2 1 0 1 2 3 4 5 6 7 8


    // // SPOSOB 1:
    
    // int rozmiar = Integer.parseInt(args[0]);
    // int tab[] = new int[rozmiar];
    // System.out.println("Wybrany rozmiar tablicy: " + rozmiar);
    // System.out.print("Tablica: ");
    
    //     for(int i = 0; i < rozmiar ; i++)
    //     {
    //         tab[i] = (rozmiar - 2*i - 1)/2; // dla parzystego rozmiaru ucinane jest to co po przecinku, np. dla i = 0 tab[i] = 10.5,
    //         // ale program widzi to jako dzielnie liczb calkowitych, wiec wypisuje tylko 10
    //         if(tab[i] < 0)
    //         {
    //             tab[i]=Math.abs(tab[i]); // wartosc bezwzgledna, aby nie bylo wartosci ujemnych
    //         }
    //     }
    
    //     for(int i : tab)
    //     {
    //         System.out.print(i+" ");
    //     }
    


    // // SPOSOB 2:
    
    // int rozmiar = Integer.parseInt(args[0]);
    // System.out.println("Wybrany rozmiar tablicy: " + rozmiar);
    // int tab[] = new int[rozmiar];
    // // Wypełnianie tablicy
    // if (rozmiar%2 == 1) 
    // {
    //     tab[rozmiar/2] = 0;
    //     for (int i = 1; i <= rozmiar/2; i++) 
    //     {
    //         tab[rozmiar/2 - i] = tab[rozmiar/2 + i] = i;
    //     }
    // }
    // else 
    // {
    //     for (int i = 0; i < rozmiar/2; i++) 
    //     {
    //         tab[rozmiar/2 + i] = tab[rozmiar/2 - 1 - i] = i;
    //     }
    // }
    // // Wypisywanie tablicy - pętla for-each
    // System.out.print("Tablica: ");
    // for (int i : tab) 
    // {
    // System.out.print(i + " ");
    // }

1 - Czy ten program (sposób 1) działa poprawnie dzięki tym własnościom, które wpisałem w komentarzach (wartość bezwzględna i dzielenie liczb całkowitych)?

2 - Czy mógłby Pan wytłumaczyć pętlę if i else w sposobie 2 (z odpowiedzi)?


Programowanie Dodaj post do ulubionych Poproś o pomoc
s.gugula 09-07-2025 00:26

1 - tak.

2 - if sprawdza tylko, z którym rodzajem tablicy mamy do czynienia. Jeśli rozmiar jest nieparzysty, to tab[rozmiar/2] zawsze będzie odpowiadało środkowemu elementowi (z podobnego powodu, który wykorzystałeś w Twoim sposobie) i potem po prostu jednocześnie idziemy na lewo i na prawo od tego środkowego elementu wypełniając tablicę kolejnymi liczbami naturalnymi. W elsie też tak robimy, tylko że tam nie ma środkowego elementu, a są dwa środkowe, które akurat można zapisać jako tab[rozmiar/2] i tab[rozmiar/2 - 1].


Artur 09-07-2025 14:25

2 - tab[rozmiar/2 - 1] minus jest dlatego, że chodzi o indeksy?

Dlaczego to wszystko przyrównujemy do i?   tab[rozmiar/2 - i] = tab[rozmiar/2 + i] = i;


s.gugula 10-07-2025 14:45

Tak.

Bo i to będą kolejne liczby naturalne, to już akurat robimy tak dlatego, że w treści zadania jest takie polecenie :)


Artur 10-07-2025 15:20

2 - trochę nie rozumiem, czyli ta tablica będzie się wypełniała na lewo i prawo na boki zaczynając od środka?


s.gugula 11-07-2025 20:54

Dokładnie tak.


Zadzwoń teraz Dotknij, aby się ze mną skontaktować.