droga rozwoju poczatkujacych

0

Witam, jestem w symfonii c++ na rozdziale wskaznikow, nic z nich na teraz nie rozumiem ale nie o tym ten temat. Jak mozna sie domyslic jestem bardzo poczatkujacy, nie wiem na czym sie skupic tak by mozliwie jak najszybciej nauczyc sie programowac(ucze sie teraz c++ ale chcialbym rozumiec programowanie w takim stopniu bym w razie co w przyszlosci mogl np. przejsc na pythona jezeli zajdzie taka potrzeba). Oczywiscie jak najszybciej mam na mysli jak to tylko mozliwe, nie oczekuje ze po pol roku bede mogl sie brac za pisanie jakiejs wiekszej gry czy aplikacji ale chcialbym te droge skrocic jak najbardziej to mozliwe do minimum. Jak wspomnialem w symfonii jestem na etapie wskaznikow, ale nic z tego nie moge zrozumiec(w sensie sama idee wskaznikow), jednoczesnie czytam tez kurs xion'a (do pisania gry kolko i krzyzyk przyznam szczerze ze wszystko rozumialem ale gdy tylko zaczal to omawiac to zbladlem).
Dzisiaj zastanawialem sie co w tym kierunku zrobic, no i na zastanawianiu sie skonczylo... po grze kolko i krzyzyk xion leci z obiektowoscia, kiedy nie do konca umiem programowanie strukturalne, za to w symfonii sa te cale wskazniki, ktore zajmuja bardzo duza czesc pierwszego tomu wiec pominac ich nie sposob (jezeli ktos rozumie o co mi chodzi, nie chce zostawiac sobie dziur) a ja nie widze potrzeby ich uczenia sie(na moim etapie nauki).

Co byscie mi radzili sie w pierwszej kolejnosci uczyc? obiektowosci a potem zwiazanych z nia zagadnien czy raczej pisac programy strukturalnie (bron boze nie sugeruje tutaj ze umiem, powiem ze cos umiem jak nie bede mial problemu z napisaniem np. jakiejs bardziej zaawansowanej gry). A moze klepac jakies czysto matematyczne programy? (jezeli tak to skad wziac przykladowe zadania do takich?)

Mam nadzieje ze ktos mnie zrozumial

5

Wskaźniki są fundamentalnym pojęciem istniejącym od zawsze w komputerach i programowaniu.
Koncepcję wskaźników trzeba rozumieć nawet w językach, które jawnie ich nie posiadają. Wskaźnik, istnieje zarówno w asemblerze jako adresowanie pośrednie, aż po języki wysokopoziomowe w postaci referencji do obiektów. Tak więc od wskaźnika nie uciekniesz. Dlatego w większości książek wskaźniki zajmują kawał tekstu.

Koncepcja jest prosta: To pudełko przechowujące adres innego pudełka. Są tylko dwie operacje - wyciągnięcie wskaźnika, czyli uzyskania adresu pudełka oraz dereferencja, czyli operacja odwrotna - uzyskanie zawartości pudełka mając jego adres. W C/C++ są to operatory & oraz *. Oba jednoargumentowe.

Procesor odczytując kolejne instrukcje robi to za pomocą rejestru wskaźnika instrukcji gdzie ma adres instrukcji, odczytuje ją z pamięci pod tym adresem, wykonuje i zwiększa wskaźnik o 1, żeby odczytać następną. Są instrukcje takie jak wszelkie skoki i pętle, które przesuwają wartość tego wskaźnika o więcej niż 1 i wtedy po niej odczytywana jest inna instrukcja - nie po kolei. Podobnie działa każdy stos - wskaźnik stosu zawiera adres zmiennej/komórki, która jest za/nad ostatnią wartością zapisaną na stos. Jedna operacja zapisuje wartość do komórki o tym adresie i przesuwa wskaźnik o 1 dalej, a druga operacja robi odwrotnie - przesuwa wskaźnik o 1 bliżej i odczytuje wartość spod takiego adresu. Działa to właśnie tak jak stos (np. talerzy), dlatego dostało to taką nazwę.
Wszelkie indeksowania tablic, to też operacje na wskaźnikach. Masz adres początku tablicy oraz indeks elementu. Indeks dodajesz do adresu początku tablicy i wtedy dostajesz adres elementu, który odczytujesz. Nie ma innej realizacji indeksów tablic niż ta. Dzieje się tak w każdym komputerze, kalkulatorze i IPhonie bez względu na język programowania.

Co do etapów - bez względu na to w jakim języku się pisze, to początkujący pisze najpierw programy płaskie (kolejne instrukcje), potem ze sterowaniem (wykonania warunkowe, pętle), następnie strukturalnie (procedury, funkcje) i dopiero na końcu obiektowo (o ile język to wspiera). Do tego wszystkiego równolegle poznaje struktury danych takie jak zmienne, wskaźniki/referencje, tablice i struktury oraz połączenie koncepcji struktur i procedur/funkcji, czyli obiekty.
Jak już nie jest zupełnie początkujący to poznaje jeszcze polimorfizm, programowanie zdarzeniowe oraz współbieżność i programowanie aspektowe.
Język nie ma nic do tego bo i tak będzie trzeba się nauczyć co najmniej czterech różnych: jakiegoś obiektowego, jakiegoś do skryptowego, jakiegoś asemblera i jakiegoś webowego.

ps. Jeżeli nie poradzisz sobie ze wskaźnikami, to od razu poleciłbym poszukać jakichś innych pięknych zawodów - pilota wycieczek, kapitana żeglugi morskiej czy operatora dźwigu śródlądowego. ;)

1

Zaczynając od C++ robisz sobie krzywdę. Ten język to sprytnie zamaskowana nakładka na assemblera. W tym sensie, że musisz go znać by dobrze w C++ programować. C++ to język kulfon, który tak naprawdę nie widomo do czego służy. Np. Java działa w wielu przypadkach składa lepszy kod niż najlepsze kompilatory C++. Szybkość C++ to dziś mit. Sterowniki ze względu na kulawe biblioteki lub często niemożność ich użycia zaleca się pisać w C. Skoro tak, to C++ w zasadzie do niczego się dziś nie nadaje. Wskaźniki i inne duperele to domena C/C++. W innych językach ich nie ma lub są ukryte, więc nikt sobie nimi d. nie zawraca.

Wymienię tu główne dziedziny i najlepsze do tego języki:

  1. Programowanie systemowe,sterowniki : ASM + C
  2. Aplikacje desktopowe : C#, Java (oba ze względu na dużą liczbę bibliotek z naciskiem na Javę)
  3. Aplikacje webowe: Java (GWT, Vaadin), JavaFX 2.x, Opa, Dart, JavaScript
  4. Strony internetowe: PHP, Java, ASP, JavaScript
  5. Aplikacje mobilne: C, Java, C#, JavaScript,
  6. Gry: C++, Java, C#
  7. Aplikacje finansowe, systemy transakcyjne : C, Java

Widzisz, C++ to już tylko domena gier i to dość mniejszościowa.
Jeżeli twój przyszły zawód to kołodziej, to przepraszam, ucz się C++.

Jako ciekawostkę dodam, że AMD wraz z Oracle planują wspomóc matematyczne biblioteki Javy w dostęp do GPU.

5

@majaczek nie martw się, że po wejściu we wskaźniki w symfoni niczego nie rozumiesz. Też tak miałem. Wszyscy ludzie tak chwalą symfonie a mi właśnie ona nie przypasiła bo to jakoś tam się wszystko nie zazębia. Dlatego właśnie jak zacząłem przerabiać wskaźniki w symfonie to powiedziałem dość tak być nie może że czytam i g**** wiem. Porzuciłem ją i przesiadłem się na "Szkołę programowania: język c++" i olśnienie. Nie ma tam całych kilku rozdziałów pod rząd o wskaźnikach i wałkowania do znudzenia tego samego, wszystko poznajesz po kolei. Najpierw po prostu wiesz, że istnieje i jak tego użyć tak samo jak wiesz o np tablicach. Kiedy wkraczasz w coraz to bardziej zaawansowane zagadnienia to to sie po prostu rozszerza. Teoretycznie można by pomyśleć, że chaos ale kiedy się zagłębiasz to nie ma chaosu bo właśnie masz wszystko ułożone jakby to były lekcje w szkole. Wszystko rozszerzane z każda stroną. Wtedy zrozumiałem Idę wskaźników i to bardzo łatwo. A do czego się przydają? A no właśnie do wydajności. I proszę nie mówić, że c++ nie jest wydajny bo jest i to bardzo i to właśnie dzięki wskaźnikom. Jeżeli pisze aplikacje jakąś zwykłą bez większego nacisku na szybkość. pisze to oczywiście w C# ale jeżeli kładę nacisk na wydajność (np szyfrowanie) to nigdy nie zrobię tego czegoś w C# bo już robiłem i porównywałem i za każdym razem to kod wynikowy z C++ był szybszy.
A teraz @majaczek podam ci prosty przykład. Gdzie wskaźniki ogromnie się przydają. Jak zapewne wiesz przekazanie czegoś do funkcji przez zmienna tworzy jej kopie wewnątrz funkcji, a co jeśli chcemy jednak coś zmienić w tej zmiennej? Teoretycznie możemy zwrócić i przypisać, gorzej jeżeli chcemy zwrócić coś innego a przy okazji zmienić jeszcze coś w przekazanej zmiennej. Przekazując wskaźnik mamy dostęp do wartości więc możemy ją zmienić. Poza tym jak przekazać tablicę do funkcji? jak wydajnie przekazać strukturę? Lepiej kopiować każdą składową czy przekazać jeden adres? ;)

0

@Olamagato Skoro wskazniki to fundamentalne pojecie to musze sobie z nimi poradzic, a Co do zawodu to kto powiedzial ze musze byc zawodowym programista? (szczerze mówiąc pilot wycieczek by mnie bardziej pociagal, jezeli miałbym taka mozliwosc to bez wahania bym nim zostal).

Do tego, ze c++ to wymierający/uposledzony/niewydajny jezyk sie odwoływac nie bede (a przyklad microsoftu to bardzo zły przyklad, choc sam mam ich system, choc w sumie mozna potraktowac moj komentarz odnosnie tego za zbedny bo sie nie znam, wiedze opieram tylko na teorii(z microsoftem to z praktyki :D))

@mr_jaro sprobuje z tą szkola programowania juz dzisiaj wieczorem.

A co do programowania obiektowego, przejsc jak najszybciej czy raczej opanowac strukturalne(opanowac w moim przypadku mam na mysli wiedze w jaki sposob program mialby wygladac w oparciu o strukture programowania strukturalnego :D).

Tak nawiasem mowiac jezeli uda mi sie bardziej wglebic w temat to oczywiste bedzie poznanie assemblera chociazby w stopniu w jakim znam teraz c++(ze zwyklej ciekawosci, mialbym chociaz jakas tam wiedze jak dziala procesor a to zaspokoiloby moja ciekawosc swiata w jakims tam procencie :D).

0

Oczywiście, że musisz po kolei gdyż całą wiedzę z programowania strukturalnego wykorzystujesz w programowaniu obiektowym. Jakby to powiedzieć najprościej... programowanie obiektowe upraszcza rozwój programu, rozdziela jedną rzecz wykonywana przez program od drugiej np piszesz sobie osobna klasę do obsługi pliku ini i tylko tego pliku niczego więcej, wiec jak chcesz coś zmienić to nie latasz po kodzie tylko zaglądasz do tych plików w których ta klasa jest. Czemu najpierw strukturalne? A no dlatego, że w programowaniu strukturalnym program opiera się o funkcje i dane a klasa zawiera i funkcje i dane wiec bez wiedzy o programowaniu strukturalnym o poznaniu rożnych rodzajów zmiennych prostych/złożonych, stałych, różnego wykorzystania funkcji nie zbudujesz klasy a bez klasy nie ma programowania obiektowego ;)

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