Problemy z tablicami w Java


(Lasthaoss123) #1

Witam, dostałem zadanko do zrobienia, brzmi następująco: 

Utwórz tablice 100 elementową, umieść w niej wartości z przedziału <0-1000> następnie wyświetl co drugą wartość na ekranie.

Zrobiłem coś takiego - http://wklej.org/id/1897444/   i mam teraz do was wielkie pytanko czy to tak może zostać i czy to w ogóle jest dobrze ? jeżeli tak to super a jeżeli nie to prosiłbym o pokierowanie mnie w bardziej prawidłową stronę. Proszę o wielką wyrozumiałość ponieważ tak na prawdę to zaczynam dopiero swoją przygodę z programowaniem. Nigdy wcześniej tego nie robiłem.

Mam jeszcze kolejne zadanie trochę się nad nim zastanawiałem, ale nie wiem czy można je do końca w taki sposób rozwiązać. Brzmi następująco:

Utwórz tablice 100 elementową, umieść w niej wartości parzyste z przedziału <0-1000> następnie wyświetl wartości na ekranie. 

Myślałem by zrobić to w podobny sposób jak próbowałem w zadaniu wyżej, nie wiem czy dobrze mi się wydaje ale najprostszym sposobem na osiągnięcie liczby parzystej było by moduło ? (%2 ==0) tylko nie wiem co po nim zapisać by program wyświetlał już tylko wartości parzyste. Mógłby ktoś nakierować ?

 

Z góry dziękuję za chęć przeczytania mojej wiadomości.

Pozdrawiam.


(kostek135) #2

Robisz to nie zgodnie z poleceniem, nie losujesz 100 liczb tylko 50, oraz nic nie umieszczasz w tablicy.


(Frankfurterium) #3

W pierwszym zadaniu w ogóle nie wypełniasz tablicy. Powinieneś stworzyć dwie pętle - jedna do uzupełnienia tablicy, drugą do odczytu co drugiej liczby. W drugim zadaniu całkiem podobnie, tylko w pierwszej pętli zadbaj o parzystość wpisywanej do tablicy liczby.


(Fizyda) #4

Nie masz racji, takich rzeczy się nie robi bo hardcodowanie danych jest poważnym błędem, a jeszcze większym w etapie nauki bo to wyrabia w uczącym się bardzo złe praktyki.

Co do problemu to tak jak napisał Frankfurterium, a nawiązując do wiadomości prywatnej to Java Script i Java to 2 różne języki służące do czego innego i wspierające inne paradygmaty programowania.


(Lasthaoss123) #5

Dziękuję za odpowiedź. Czyli po prostu muszę umieścić liczby od 0-1000 w tablicy,

Zrobiłem tablicę i umieściłem w niej wartości od 0-1000 za pomocą funkcji Math.round oraz Math.random by były wyłącznie typy int. Teraz wygląda to następująco:

 

package Podstawy1;
public class pcformat
{
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        
        int[] tablica = new int[20];
        for (int i = 0; i < tablica.length; i++)
        {
            tablica[i] = (int)Math.round(Math.random()*1000);
            System.out.println(tablica[i]);
        }
    }
}

 

Teraz muszę stworzyć drugą pętle do odczytu wartości tylko mam pytanko w jaki sposób wypisać co drugą liczbę na ekranie ? można to próbować robić za pomocą zwiększenia indeksu o 2 ?

 

 


(Frankfurterium) #6

Rozważ, jakiego wyniku oczekujesz, sprawdź i porównaj faktyczny wynik z oczekiwaniami.


(Lasthaoss123) #7

Nie mam pojęcia jak to zrobić, próbowałem stworzyć tą pętlę jednak nic nie wychodzi. Mógłby ktoś troszkę bardziej pomóc. 

Zastanawiałem się nad tym, jednak nic nie przychodzi do głowy. Mógłby Pan dać mi jeszcze bliższą wskazówkę ? Ponieważ nie wchodzi mi żaden sposób do głowy w jaki mógłbym wyświetlić co drugą liczbę. Próbowałem zwiększyć indeks o 2 jednak nic z tego nie wychodzi, program wyświetla wtedy 50 elementów z 100 elementowej tablicy ponieważ wartości liczą się x2. Myślałem o tym by jakoś w inny sposób wykorzystać ten indeks jednak też nie przyszło mi nic do głowy.

Moglibyście dać jakieś bliższe wskazówki :slight_smile: ?


(Fizyda) #8

Jeśli wyświetlasz co drugą liczbę to wyświetlisz zawsze połowę (prawie). A żeby to zrobić to robiłeś dobrze zamiast i++ to i+2 i z głowy.


(Lasthaoss123) #9

No i właśnie to zrypałem :smiley: miałem dobrze i teraz znowu coś namotałem sobie w kodzie :slight_smile:

Może ktoś pomóc bo coś chyba namieszałem w pętli która miała wypisywać wyrażenia.

        int[] tablica = new int[100];
        for (int i=0; i<tablica.length; i++)
        {
            tablica[i] = (int)Math.round(Math.random()*1000);
            System.out.println(tablica[i] + " , ");
            
            for (int j=0; i<tablica.length; i=i+2)
            {
                System.out.println(tablica[i] + " , ");
                }
        }
    }
}

 

Pomógłby Pan ?


(slepcu) #10

Nie zagnieżdżaj pętli w pętli. W tym przypadku wpierw zrób pętlę, która losuje wartości, a potem drugą, która je wypisuje.

I nie motaj zmiennych pętli j i i , to są straszne błędy, których nie widać i trudno je potem znaleźć. jak już druga pętla nie będzie w pierwszej spokojnie możesz wszędzie używać jednej nazwy zmiennej do iteracji po pętli.


(Lasthaoss123) #11

Chyba zrozumiałem jednak kiedy “wyjąłem” jedną pętle zamknąłem i drugą również, zastosowałem te same nazwy zmiennych ponieważ mówił Pan że nie będzie problemu i nie będą się duplikować to po kompilacji połowa wartości wychodzi z jednej pętli natomiast druga połowa z drugiej, tak raczej nie powinno to wyglądać prawda ? 

Jeżeli Pan chce to mógłby Pan zerknąć na to okiem ? Czy wszystko wygląda tak jak powinno ?

        int[] tablica = new int[100];
        for (int i=0; i<tablica.length; i++)
        {
            tablica[i] = (int)Math.round(Math.random()*1000);
            System.out.println(tablica[i] + " , ");
        }
        
        for (int i=0; i<tablica.length; i++)
        {
            tablica[i] = (int)Math.round(Math.random()*1000);
            System.out.println(tablica[i] + " , ");
        }
    }
}

Nie wiem czy przypadkiem w pierwszej pętli linia System.out… nie powinna być usunięta ? Chociaż wydaje mi się że nie bo wtedy nie będzie pokazywało wartości które znajdują się w tabelce. Po kompilacji kodu wyżej zamiast tablicy 100 elementowej mam tablicę 200 elementową ponadto 100 elementów jest po kompilacji z pierwszej pętli a drugie sto z drugiej. 

To może faktycznie ta linika z pierwszej pętli z System.out powinna być usunięta ?


(Fizyda) #12
int[] tablica = new int[100];
for (int i=0; i<tablica.length; i++)
{
    tablica[i] = (int)Math.round(Math.random()*1000);
}

for (int i=0; i<tablica.length; i+2)
{
    System.out.println(tablica[i] + " , ");
}

Bez urazy, ale to Ci pomoże: nie umiesz programować, naucz się podstaw i zasad o co w tym chodzi. Nie umiesz myśleć jak programista - nie wiesz jak działa program, nie czujesz tego.

EDIT:

Nie napisałem tego żeby Cię zniechęcić tylko żebyś przerobił podstawy, bo albo nauczyciel który Cię uczy nie umie uczyć programowania bo sam nie ma o tym pojęcia, albo od złej strony zacząłeś naukę.


(Lasthaoss123) #13

Dziękuję za pomoc. Oczywiście nie biorę tego jako urazę tylko jeszcze większą motywację do działania. Jestem samoukiem i uczę się tak na prawdę wszystkiego sam na własnych błędach. Myślę że kiedyś może to wszystko zrozumiem. A Pan myśli że mogę się tego nauczyć czy raczej to jest już wrodzone :slight_smile: ? “wysysa się to z mlekiem matki” ?

 

Dziękuję za pomoc w zadaniu. Chyba byłem blisko by to rozwiązać, sam już nie wiem, ale bardzo dziękuję za to że się tak ze mną męczyliście, dawaliście wskazówki z których pewnie nie za wiele wyniosłem jednak chcieliście mi pomóc a chęci się liczą. Jeszcze raz dziękuję.


(Fizyda) #14

Wszystkiego da się nauczyć, fakt rodzimy się z predyspozycjami do niektórych rzeczy, ale co z tego skoro wiele osób zaprzepaszcza swój talent? Ja np jestem tak zwanym umysłem ścisłym i zawsze wolałem matematykę od polskiego, aż w końcu stwierdziłem że za duży ze mnie głąb jeśli chodzi o przedmioty humanistyczne i tak jakoś się stało że dzięki świetnej polonistce w szkole średniej nagle rozwinąłem skrzydła na tym polu. Jak się później okazało nawet nie zły ze mnie artysta, może nie jakiś z pierwszego zdarzenia, ale jednak umiem wymyślić jakiś design strony, logo czy coś innego co wcześniej stanowiło ogromny problem. W ogóle problemem było wymyślenie co chcę narysować na plastykę, więc zazwyczaj odrysowywałem gotowce. Bo nie dość że nie umiałem wymyślić to nie miałem do tego ręki, a teraz tworzę logo umiem myśleć kreatywnie, nieszablonowo i tworzyć nowe rzeczy, do tego poznałem narzędzia takie jak Photoshop czy Illustrator i powiem szczerze że czasami lubię sobie w ramach odpoczynku od kodowania pogrzebać coś w grafice i zrobić jakiś fotomontaż albo poprzerabiać zdjęcia.

Głównie staram się rozwijać jako programista, ale nie porzucam umiejętności jakie udało mi się zdobyć.

Więc sam sobie odpowiedz na zadane przez Ciebie pytanie.

Jeśli miałbym wskazać komuś drogę do nauki programowania (co nie raz już zdarzyło mi się robić i zawsze mówiłem to samo) to warto zainwestować 120 zł w książkę Symfonia C++ Jerzego Grębosza. Jest to chyba biblia programowania, a na pewno najlepsza książka do nauki programowania w języku polskim bo tłumaczenia nawet najlepszych pozycji jednak coś w nich zabijają. To jest książka napisana przez polaka więc nie ma mowy o błędach wynikających z tłumaczenia. Może C++ nie jest już dziś popularnym językiem, ale mimo wszystko moim zdaniem warto go znać, dodatkowo trzeba mieć na uwadze, że książka nie jest do końca aktualna tj. nie traktuje o nowych rzeczach wprowadzonych do języka C++ w ostatnich latach, ale to o czym pisze jest jak najbardziej aktualne w C++.

Moim zdaniem warto znać C++ bo jak znasz C++ umiesz programować prawie w każdym języku programowania, ponieważ większość języków posiada składnię z C++ - Java też. Więc później przesiadka na inne języki to tylko kwestia zapoznania się z bibliotekami języka no i poznania niuansów danego języka. Osobiście gdybym jeszcze raz miał rozpocząć naukę programowania to na 100% zacząłbym ją właśnie od C++, a może nawet pokusiłbym się o zejście jeszcze poziom niżej i zacząłbym od C, ale nie pomijając później C++.

Ogólnie jeśli mam być szczery to najbardziej lubię programować w C/C++, żadne javy czy inne języki wysokiego poziomu mnie jakoś nie przekonują za bardzo, jeśli o pisanie aplikacji chodzi. Ewentualnie jeśli już musiałbym wybrać jakiś język programowania wysokiego poziomu to byłby to C#, ja Javy po prostu nie trawię no i mam wrażenie że ona powoli umiera. Fakt jest naprawdę często wykorzystywana, ale myślę że jej złote dni właśnie dobiegają końca, ewentualnie osiągnęły szczyt i teraz będzie tylko spadek. Możliwe że dzięki Androidowi jakoś się jeszcze będzie trzymała, ale może dojść do tego że javy będzie się używać tylko to pisania programów dla Androida, no i pewnie utrzymywać będzie się projekty stworzone w Java EE.

Błędy które popełniasz są wybaczalne dla osoby która się uczy, ale z kilometra widać że uczysz się źle, coś tam niby wiesz, ale nie czujesz kodu i lecisz metodą prób i błędów - na zasadzie kiedyś trafię w rozwiązanie które zadziała.

PS. Nie mów do mnie per “Pan” bo fakt stary jestem, ale żaden ze mnie Pan.


(Lasthaoss123) #15

Dokładnie jak mówisz, szukam rozwiązania metodą prób i błędów. Wiem że to niezbyt dobry sposób na naukę ponieważ zaszczepia we mnie złe przyzwyczajenia odnośnie programowania. Próbuje się jednak tego nauczyć, kiedy zrobię samemu jakieś proste zadanko nawet typu równanie kwadratowe czy tym podobne to strasznie jestem z tego dumny. Pragnę tej wiedzy, chciałbym zostać programistą. Skończyłem szkołę, zawsze uwielbiałem nauki ścisłe, po korepetycjach z matematyki stała się ona moją ulubioną dziedziną ze względu na to że tam nigdy nic nie dzieje się bez przyczyny. Tam wszystko ma swoje miejsce i swój punkt w którym powinno się znajdować, myślę że programowanie też tak ma, może dlatego jestem tak chętny by się tego uczyć. 

Mówiłem na Pan ze względu wieku ale też na osiągnięcia, z niczego Twoje umiejętności się nie wzięły a niektórzy nie lubią jak się im mówi po imieniu. Staram się być kulturalny.

Dziękuję za rady które mi dałeś, postaram się ich nie zmarnować, na pewno kupię książkę którą mi poleciłeś, myślę  że wiele z niej wyciągnę. Dlaczego zacząłem od Javy ? Może dlatego że obecnie na studiach od tego zaczęliśmy a jak już widać mam wielkie wielkie zaległości w programowaniu jak na studenta to brałem się po prostu za ten język by chociaż spróbować coś zrobić, oddać prace zaliczeniowe, a nie poddać się jak to bym mógł zrobić.

Na pewno zobaczę język C++ i tutaj racja że Java posiada bardzo podobną składnię do C++ nie umiem programować dopiero się uczę ale porównywając kod javy i c++ widać to gołym okiem.

Dziękuję jeszcze raz Tobie (skoro już możemy sobie mówić na Ty) i innym jeszcze “Panom” za chęć pomocy mi w tym temacie, wiele się ze mną namęczyliście i mogę was zapewnić że to nie ostatni raz :D 

Pewnie jak znając siebie jeszcze wiele tematów tutaj założę by poprosić was o pomoc, mam nadzieje że i wtedy mi nie odmówicie.

Dziękuje jeszcze raz wszystkim za pomoc. Jest mi niezmiernie miło że chcieliście za wszelką cenę wszczepić we mnie chociaż troszkę tej programistycznej wiedzy.

Serdecznie Pozdrawiam.