C++ - Przejście na poziom zaawansowan

C++ - Przejście na poziom zaawansowan
1

Cześć,
Od gimnazjum korzystałem z C++. Pisałem proste programy - głównie algorytmiczne rzeczy pod olimpiadę. Kiedyś w II gimnazjum (jakieś 5 lat temu) czytałem symfonię C++, a tam było sporo rzeczy z których nie korzystam na co dzień robiąc zadanka z topcodera, codechefa czy codeforces.

Mam pewną wiedzę, intuicję programistyczną, operuję w C++ z łatwością - takie zadanie jak TC DIV2 250, gdzie głównie chodzi o szybki i poprawny kod, przelanie pomysłu z głowy na komputer przychodzi mi bez problemu.
Chciałbym teraz przeskoczyć o poziom wyżej. Z klepacza algorytmów na zaawansowanego programistę C++.

Nie korzystam z wyjątków, dziedziczenia, polimorfizmu, klasy piszę sporadycznie, z STLa znam głównie vector, map, list, stack, algorithm. Czego powinienem się nauczyć by zabrać się na przykład za tworzenie i pomoc w open-source? Z czego na co dzień korzysta się w firmach programistycznych ?

Czego wg was powinienem się nauczyć? Skąd?

Zellus
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 4 lata
  • Lokalizacja:Wrocław
  • Postów:474
1

Nie korzystam z wyjątków, dziedziczenia, polimorfizmu, klasy piszę sporadycznie

Zacząłbym od tego, naucz się wyjątków, dziedziczenia, polimorfizmu i pisania klas :) nie napisałeś tez nic o template - ich też się dosyć często używa w C++.
Dobrze poznaj też jakieś IDE, osobiście jak kiedyś pisałem to wystarczał zwykły edytor tekstu. Ale jak zapoznasz się dobrze z jakimś dobrym edytorem to znacznie Ci to pomoże, w szczególności jak zaczniesz używać polimorfizmu.

Z czego na co dzień korzysta się w firmach programistycznych ?

Korci mnie aby napisać że z szybszych (pod względem developmentu) języków, ale tego nie zrobię...

spartanPAGE
Oj nie przesadzaj, C++ jest w top 10 używanych języków
Zellus
Wiem że trochę to wyolbrzymiłem, ale miałem na myśli fakt że ogólnie coraz mniej nowych projektów startuje w tym języku.
spartanPAGE
Też masz w tym swój udział :P spokojnie
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
10

Robienie zadań na olimpiadę ma się tak do programowania jak rozwiązywanie szarad do pisania książki.

Czego mi w tej historii zabrakło:

Tego raczej się nie doświadcza w jedno-stronicowych programach. Dlatego warto się tym zainteresować.

Edit: dodałem Andrei'a, polecam jego "Modern C++ Design".

edytowany 2x, ostatnio: vpiotr
Zobacz pozostały 1 komentarz
several
Zasejwowałemm sobie tą stronę w swoim TODO dla tego posta. Aczkolwiek niektóre punkty sobie odpuszczę, te które w moim konkretnym przypadku są nieaktualne lub byłyby typem pracy określanej "sztuką dla sztuki".
vpiotr
@several: Chyba zacznę robić jakiś blog technologiczny, mam kupę takich zestawień. C/C++/Java/Delphi/Python dla przedszkolaków i programistów z brodą.
spartanPAGE
Tak się teraz zastanawiam... Jak ktoś w xcode robi to źle rozumiem?
vpiotr
@spartanPAGE: źle rozumiesz. To są główne, a nie wszystkie kierunki.
vpiotr
trochę więcej tutaj: http://bit.ly/1p9ho4X
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
1

IMO najlepiej zająć się długoterminowym projektem. Czemu? Bo w ten sposób będziesz musiał naprawiać swoje własne bugi i będziesz wtedy rozumiał co robiłeś wcześniej źle.
Jest to o wile lepsze niż, gdy ktoś na siłę próbuje ci wytłumaczyć, że masz źle, a ty mu odpowiesz: "przecież działa".
Poznanianie wszystkich technologi i nie ma sensu bez długoterminowej praktyki, bo efekt będzie taki jak studenckie 3*Z (zakuć, zdać, zapomnieć).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
Lucas Darkstorm
Lucas Darkstorm
Raczej 4*Z - Zakuj, Zdaj, Zapomnij, Zapij xD.
MA
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 3 lata
  • Postów:166
0

Zdecydowanie polecam książkę Scotta Mayersa "Effective C++". Nie zapomnij też o praktyce czyli kodowaniu :)

0

Cześć,
Dzięki za odpowiedzi :) Polecicie od czego zacząć? Dużo tego i trochę mnie to przeraża...

gośćabc
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Szczecin
  • Postów:500
0

ja bym zaczął z grubej rury; mmo server; poznasz wszystko co potrzebne, aby być dobrym koderem; dużo literatury i googlowania, znajomość angielskiego to minimum

edit:

a tu opinia kogoś kto chciał tak zacząć, ale zaczął inaczej:

http://gamedev.stackexchange.com/questions/21596/how-do-i-start-writing-an-mmo-game-server

edytowany 1x, ostatnio: gośćabc
satirev
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 lata
1

Zadałeś pytanie w taki sposób, że można na nie odpowiedzieć na tysiąc sposobów ;)
Co to znaczy znajomość C++ w stopniu zaawansowanym? Ano może to oznaczać, że w małym palcu masz takie zagadnienia jak np: perfect forwarding / znajomość wszystkich (6 sic!) reguł typowania = zawsze wiesz jaki typ otrzymasz (dla przykładu masz funkcję f: decltype(auto) f() { auto val = sth(); return val; } i wiesz czym to się różni od takiej funkcji g: decltype(auto) g() { auto val = sth(); return (val); }) / rozumiesz, że spora część idiomów C++ (< C++11) jest tylko po to, żeby chronić się przed samym językiem, np. safe bool / rozumiesz absolutnie wszystkiego kody dowolnego pana z listy Meyers/Alexandrescu/Sutter.
Pewnie nie istnieje osoba, która spełnia wszystkie te wymagania, a to przecież dopiero wierzchołek góry lodowej ;)
To co moim zdaniem warto by znać:

  • TMP, a co za tym idzie programowanie funkcyjne
  • STL i wszystko co jest w std::
  • idiomy (przede wszystkim RAII)
  • multithreading
  • wiedza nt CPU cache (cache line, cache coherency)
  • różne zagadnienia około językowe: exception safety, copy elision, sequence point, undefined behavior, argument-dependent name lookup, ...
    Czy ja to wszystko znam? Nie! Co nie oznacza, że nie staram się poznawać;)
    Jeśli idzie o sposoby nauki to w Twoim przypadku zacząłbym od tego co dotychczas pomijałeś (wyjątki, OOP, podstawy template).
edytowany 1x, ostatnio: satirev
Zobacz pozostałe 16 komentarzy
Azarien
@Satirev: twierdzisz że type traits i własny iterator to potrzebna wiedza?
vpiotr
@Azarien, wiedza o tym że np. iterator nie powinien nic dynamicznie tworzyć bo jest kopiowany na potęgę wewnątrz STL (w kolejnych krokach pętli algorytmu) bywa przydatna...
Azarien
ale jak często pisze się własny iterator?
vpiotr
za każdym razem jak tworzysz nowe kontenery pewnie...
satirev
@Azarien: własne iteratory mniej, ale type traits warto znać np. żeby nie forsować zawsze SFINAE i w zamian użyć tag dispatching.
SJ
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Bielsko-Biała
  • Postów:11
0

Ja bym proponował (nie wiem być może się mylę) zająć się czymś czysto numerycznym/obliczeniowym + optymalizacja. Tworzenie od podstaw czegoś takiego jak np. stronnicowanie w google (na razie tylko takie coś przychodzi mi do głowy) (rozwiązywanie takiego typu problemów)...tak żeby było dużo obliczeń numerycznych. Projektowania i pisania aplikacji (najlepiej zacząć od kartki) jakie mają być klasy, jak ma wszystko działać i jak zaprojektować aplikację tak, żeby kod potem się nie "rozjechał". To ja bym nazwał jako drugą część fachowości programisty - projektowanie, numeryka. Tylko nie wiem jak z tym, bo teraz prawie wszystko zastępuje się narzędziami (więc też tutaj radzę zapoznać się z tym), i takich rzeczy prawie już się nie pisze. Trzecią bym nazwał znajomość wszystkich magicznych sztuczek w językach programowania np. w C++. Powiem tak jak ciągnie Cię w stronę programowania to to wszystko ogarniesz.

edytowany 2x, ostatnio: shJeff
n0name_l
Nawet autor tego jezyka tych magicznych sztuczek nie 'ogarnia'. -.-'
SJ
Z tego co wiem w C słowo kluczowe const nie zawsze oznacza stałą.
pasasap
Kiedy stała nie jest stała? ;'D
pasasap
Ach, to rzutowanie w C. Po co deklarować jako stałe, jak i tak można zmieniać? ;'DD
vpiotr
C to nie język z deklaratywną poprawnością jak Ada czy inne jeszcze lepsze cudaki. W C/C++ const to taki "hint" dla kompilatora że jeśli by dał radę, to niech sprawdzi czy czasami czegoś nie nadpisujemy. Zresztą programy w Ada też się wykładają: http://en.wikipedia.org/wiki/Ariane_5_Flight_501#Arithmetic_overflow
vpiotr
Coś o poprawności kodów Ada vs C (nie chce mi się szukać czegoś bardziej rozbudowanego): http://sunnyday.mit.edu/16.355/c130j.pdf
Azarien
@pasasap: const volatile oznacza, że zmiennej nie wolno nam zmieniać, ale może zmienić wartość samoistnie - np jest to rejestr sprzętowy albo zmienna modyfikowana przez inny wątek (z tym ostatnim należy uważać: samo volatile często nie wystarcza do osiągnięcia thread-safety).
Azarien
@vpiotr: z tym Ariane to wyłożyła ich właśnie zbyt restrykcyjna kontrola runtime: gdyby komputer „wzruszył ramionami” na ten overflow i działał dalej, to nic by się nie stało (najwyżej jeden z kontrolerów zauważyłby „anomalię” na ekranie i również wzruszyłby ramionami). a tak, ten zupełnie zbędny wyjątek wyłożył cały program i pozostało tylko wcisnąć Duży Czerwony Przycisk.
vpiotr
Są systemy w których overflow związany jest nie tyle z dodatkowym pikselem na ekranie tylko np. z włączeniem dopalaczy lub nie. Dobrze że to był lot bezzałogowy.
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
1

@shJeff: programowanie stronicowania stron www to nie są problemy numeryczne (chyba że na poziomie podstawówki).
Ale jest to jakiś pomysł żeby zahaczyć o temat web.
Można zrobić w C/C++ program CGI i cieszyć się jego działaniem. Będzie to tak mało praktyczne że aż przyjemne :)

Dlaczego mało praktyczne? C/C++ są tak mało dynamiczne że robienie w nich stron jest bardzo pracochłonne.
Ale prosta strona w C jest ciekawą wprawką. Zwłaszcza jak ktoś się przymierza do Embedded C/C++ i programowania np. routerów lub dysków sieciowych.
Albo serwisów RPC (moi).

Polecam:
http://www.ritlabs.com/en/products/tinyweb/
http://itsecuritylab.eu/index.php/tag/tiny-web-server-cgi/

(GNU/komercja) https://code.google.com/p/mongoose/
(MIT) https://code.google.com/r/vpiotr-mongoose-cpp/

0

Nie czytaj nawet tytułów tych wszystkich głupot... magisterków z uniwerków.

Bierzesz porządny projekt - jakiś większy program na tapetę, no i robisz go.
I wtedy bardzo szybko się dowiesz czego potrzebujesz.

spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:4 dni
3
fur napisał(a)

Nie czytaj nawet tytułów tych wszystkich głupot... magisterków z uniwerków.

To nie jest kopanie rowów, tutaj wiedza jest dość przydatna :]

edytowany 3x, ostatnio: spartanPAGE
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)