Nauka programowania w C

Witam,pragnę nauczyć się programować w jeżyku,prosiłbym o jakieś rady na początek, zasugerowanie jakiś poradników oraz właściwie w jakim programie należy tworzyć…dodam że jestem obecnie kompletnie zielony w tych sprawach,ale szybko się ucze :slight_smile:

Edit.

Jeszcze zapomniałem zapytać czym właściwie(i czy to duże różnice),różnie się C od C++?

Zacznij od razu C++, nauka czystego C nie ma tak naprawdę sensu - i tak się nauczysz tego w czasie nauki C++.

Książka: “Symfonia C++” Grębosza

IDE: Codeblocks (trzymaj się z dala do Dev-C++ - przestarzały staroć)

Podstawowa różnica między C a C++: C jest stricte proceduralny, C++ możesz pisać zarówno “staroszkolnie” proceduralnie jak i obiektowo.

Z punktu widzenia początkującego, C to tylko ograniczona wersja C++, więc ucząc się tego drugiego automatycznie poznajesz C. Również polecam książkę Pana Grębosza. Może się wydawać, że trochę “wymęcza” temat ale to ma swoje wielkie plusy.

@up

Dev-C++ od zeszłego roku znowu jest rozwijany, z tymże przez kogoś innego ale idea programu jest zachowana.

Ja osobiście zaczynałem od Visual C++ Express i dlatego polecam ten program.

A w Visual C++ Express możesz pisać programy w czystym C++ bez CLI(.NET)? Jeżeli nie to raczej lepiej z tym nie zaczynać korzystając z książek do czystego C++ - pogubi się.

Wiem że Dev-C++ jest dalej rozwijany, ale nadal nie jest w stanie konkurować z jakimkolwiek nowym IDE. Założenia są stare, interfejs stary. Raczej to rozwijanie to bugfixy niż implementacje ficzerów.

C od C++ różni się tym, że C to zaprojektowany i przemyślany język programowania, natomiast C++ to próba stworzenia ośmiornicy poprzez przybicie czterech desek do jamnika.

Z punktu widzenia początkującego, C++ wprowadza sporo zamieszania, które może się niekorzystanie odbić na efektach nauki i na dobrych nawykach.

http://pl.wikibooks.org/wiki/C

Tak, można i tak i tak.

Jeśli chodzi o różnice to http://pl.wikipedia.org/wiki/C%2B%2B#Nowe_cechy_j.C4.99zyka_C.2B.2B_wzgl.C4.99dem_j.C4.99zyka_ANSI_C_z_1989_roku

Podobnie jak poprzednicy polecam uczyć się od razu C++ a potem tylko zobaczyć czego nie ma w C.

Do C++ polecam kurs http://xion.org.pl/productions/texts/coding/megatutorial/, co prawda ma już swoje lata (void main() nie wszędzie działa, lepiej uzywać int main()) ale warto go przeczytać.

Jesli chodzi o IDE to osobiście używam Visual C++ 2010 Express i bardzo polecam :smiley:

W szkole piszemy w Code::Blocks, nie pisałem w nim wiele ale uważam, że jest bardzo proste w obsłudze i dla początkującego chyba najlepsze :slight_smile:

PS Jeśli będziesz chciał się pobawić WinAPI w Visualu to powinieneś wiedzieć, że domyślnie używa on Unicode’u, niektórzy mają z tym problemy, trochę o tym tu http://darkcult.nazwa.pl/wiki/index.php/Unicode_w_WinAPI

PPS Ogólnie na temat programowania i nie tylko polecam filmy z tego kanału http://www.youtube.com/user/GynvaelColdwind :wink:

Z tym to niech się lepiej wstrzyma. Raz że “rzeźbienie” w WinAPI jest trudne nawet dla dość ogarniętego już programisty, a dwa czystego WinAPI w normalnych projektach i tak się nie stosuje, już jak ogarnie programowanie lepiej niech się weźmie za QT czy od razu przerzucić się na .NET/Javę i tam sobie poeksperymentować z obiektowym API dla GUI.

Nie gadajcie, podstawy C++ aż takie porąbane nie są, później jest dopiero masakra.

Visual Studio odradzam na początek - wymaga stosowania projektów, co IMO jest dość niewygodne gdy programy mają 20 linijek. Code::Blocks jest na początek najlepszy. No i kompilator GCC (lub też clang, jak ktoś se doinstaluje), nie uczy żadnych dziwactw pokroju _tmain, _TCHAR, stdafx, conio,h nie trzeba używać (ani pauzy systemowej).

@nnick

WinAPI to nie tylko GUI :wink: To cały zbiór funkcji do komunikacji programu z systemem Windows (jest jeszcze NT API ale to głównie dla sterowników).

Rzeczywiście jest trochę toporne, jednak dla ogarniętego programisty nie powinno być problemu, wystarczy tylko dokumentacja pod ręką :smiley:

Mógłbyś podać współczesne IDE, które ich nie wymaga? :wink:

W Visualu też nie musisz tego używać :stuck_out_tongue:

Popieram :slight_smile:

Dziękuję za pomoc,na pewno skorzystam z waszych rad :slight_smile:

Code::Blocks nie wymaga projektów przykładowo. Możesz stworzyć projekt, ale jak nie masz żadnego projektu, to kompiluje pojedynczy c/cpp z podstawową konfiguracją.

Dev-C++ też nie wymaga, ale tamtejszy edytor kodu woła o pomstę do nieba (nie mówiąc o wersji 4.9, która jest dalej stosowana w szkołach, gdzie jest kompilator sprzed naszej ery).

No może nie trzeba w Visualu tych dziwactw używać, ale jak tworzysz projekt to sam ci tworzy. Przyzwyczai się taki początkujący do _tmainów, _tcharów, stdafx’ów, bierze udział w jakiś zawodach i narzeka że kompilator zepsuty (zwykle GCC 4.4 lub nowszy, choć spotkałem się z przypadkiem że użyto 3.3!), bo mu się kod nie kompiluje, albo przekracza czas, mimo że nie ma żadnej pętli (system(“pause”) na końcu).

:shock: Tego nie wiedziałem, aż musiałem sprawdzić. Przydatna opcja dla początkującego :slight_smile:

Wystarczy zaznaczyć Empty project przy tworzeniu projektu :stuck_out_tongue:

Chyba już ustaliliśmy, że dla początkującego najlepsze będzie Code::Blocks. A jak już się nauczy to sam wybierze.

A to ma jakiś zwiazek z Visualem :?: Poza tym przy takich konkursach zwykle jest ostrzeżenie, żeby nie dawać żadnych wstrzymywaczy.

Oczywiście, można zacząć od czystego projektu, jednak który początkujący to robi? Podobnie jestem też przeciwny dawaniu początkującym narzędzi RAD, dzięki którym nie potrafiąc zbudować zwykłej pętli mogą robić okienka. za szybko zaczynają okienka i na forach zadają głupie pytania dotyczące podstaw, które powinni opanować przed rozpoczęciem nauki okienek, jak np. “jak przenieść dane z jednej formatki do drugiej”.

Nie przy każdym konkursie jest ostrzeżenie, a nawet jak jest to w FAQ, a po rozpoczęciu konkursu i tak są pytania do prowadzących o błędy.

Związek z Visualem? Tam dopiero w którejś płatnej wersji w okienku Output czy gdzieś tam zostają wyniki wykonania programu (tak słyszałem przynajmniej). W darmowej wersji otwiera się normalnie okienko i zaraz po wykonaniu zamyka, trzeba więc te okienko zatrzymać, albo z konsoli uruchomić (a komu by się to chciało pod Windowsem robić). Za to Code::Blocks, przy uruchamianiu konsolowego projektu/gołego c/cpp program jest uruchamiany przez inny programik, który liczy czas wykonywania. Po zakończeniu programu, nie ważne czy przez exit, return w mainie, czy przez dowolny błąd, zostawia okienko konsoli wyświetlając czas wykonywania i ew. komunikat błędu, np. “Segmentation fault”. IMO bardzo przydatna opcja, nawet lepsza od zatrzymywaczy: taki komunikat to już bardzo duża podpowiedź co jest nie tak.

Taki, który czyta dobry tutorial i stosuje się do zaleceń :wink: Jednak dla początkujących lepszy będzie Code::Blocks bo można szybciej zacząć pisać :slight_smile:

Albo za wcześnie zaczynają bawić się WinAPI czy jakąś biblioteką, gdzie okienka robi się „w kodzie” i również zadają głupie pytania. Czy te pytania są mniej głupie niż te „dotyczące” wyklinanych okienek, czy może należałoby sankcjonować dostęp do zaawansowanych bibliotek albo każda instrukcja do jakiejś biblioteki powinna zaczynać się nauką programowania? Na brak chęci do nauki raczej nie ma dobrego rozwiązania :expressionless:

Nie wiem jak w płatnych wersjach, ale w Express w Output wypisywane są załadowane i wyładowane moduły, rozpoczęte i zakończone wątki w raz z kodami wyjścia, wyrzucone wyjątki, kod wyjścia procesu, itp. Rzadko z tego korzystam, osobiście wolę podgląd na żywo :smiley:

Ja, jeśli potrzebuję przytrzymać konsolę, to stawiam sobie breakpointa na klamrze zamykającej main, zwykle wystarcza :stuck_out_tongue:

A i tak niektórzy nauczyciele każą dawać getchar() na końcu, serio :!:

W Visualu jak trafi mi się segfault to mi debugger pokazuje, w której linii nastąpił. IMO bardziej przydatna opcja :smiley: A nawet jak błąd nie jest w linii wskazywanej przez debugger (najczęściej) to z pomocą stack-trace’u można zobaczyć, co się działo wcześniej 8)

Nie wiem jak w płatnych wersjach, ale w Express w Output wypisywane są załadowane i wyładowane moduły, rozpoczęte i zakończone wątki w raz z kodami wyjścia, wyrzucone wyjątki, kod wyjścia procesu, itp. Rzadko z tego korzystam, osobiście wolę podgląd na żywo :-D

To się nazywa debugowanie, każde IDE do C++ to posiada, nawet Dev-C++. Ale często się więcej dowiem z normalnego działania programu wypisując setki danych niż z debugowania, zwłaszcza jeśli algorytm jest bardziej skomplikowany.

A ja miałem w Visualu (omg kto taką nazwę wymyślił…) taki problem, że mimo błędu Segmentation Fault program wykrzaczył się dopiero przy printfie, chyba że przed wystąpieniem tego błędu było coś wypisywane.

Miałem takiego, jednak w samym zadaniu nie pisało nic o tym że mają być zatrzymywacze, więc ich po prostu nie robiłem. A że program mu się wyłączał, to jego sprawa, że nie uruchomił konsolowego programu w konsoli. Ach ci nauczyciele wychowani na Symfonii C++ i Borlandzie 3.1 używający Dev-C++, przepisujący na tablicę kod z książki dopowiadający “to powinno działać”, po czym zwykle nie działa… System nauczania informatyki w Polsce jest zacofany.

Wiem jak to się nazywa :stuck_out_tongue: Raczej trudno by było znaleźć IDE bez debuggera, nie tylko do C++.

Hmmm…, ciekawe, jesteś pewny, że po segfaulcie program podziałał normalnie jeszcze chwilę? Może segfault następował w printfie a spowodowany był jakimś innym błędem :?:

Tak jestem pewien, o ile to można nazwać normalnym działaniem, bo nie było żadnej możliwości cokolwiek wyświetlić. Jeśli przed tym segfaultem wywołałem printfa, program nie wykrzaczał się. Usunąłem problem problem i było dobrze.

C++ nie jest językiem zarządzanym, więc mogą takie problemy występować. Jeśli wykroczysz poza tablicę, ale ta pamięć jest jeszcze w obrębie aplikacji, system może tego nie złapać. Tym bardziej że pracowałem na wskaźnikach do komórek tablicy, a nie tab_._

No chyba, że tak. Wiadomo jak pamięć należy do procesu to dla systemu wszystko jest w porządku. Pewnie nadpisałeś po prostu jakieś struktury biblioteki standardowej. :slight_smile: