Nauka C++ w nowy sposób

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
0

kolejna lekcja (a raczej jej preview) dostepne tutaj

http://pastebin.com/Rf1g9yNh

dzis wieczorem lub jutro rano naniose poprawki i wrzuce na bloga.

Jeżeli @msm odzyje (ostatnio go cos nie ma) to zapewne przeniose sie na github pages (dzieki pomocy @katecpp ;))

no i oczywiscie czekam na feedback!

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
0

kolejna lekcja już jest
http://fasadin.4programmers.net/

Bardzo się ciesze, że dużo ludzi daje feedback czy to merytoryczny czy to odnosnie stylistyki :) Mam nadzieje szczególnie, że to drugie się poprawi z każdym postem.

PS... znacie cos dobrego by kolorowalo skladnie i normalnie wciecia robilo?
Korzystam z tego http://hilite.me/ ale wciecia robi tragiczne :(

PSS. Jakies pomysly na ciekawe zadania z if i for ?

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
0

Jeszcze odpowiem, bo moze ktos obserwuje watek to dostanie powiadomienie o nowym poscie...

Chce od czwartego rozdzialu pokazac pare projektow i rozwijac je (rozszerzac je, pisac bardziej obiektowo, dopisywac funkcjonalnosci etc). Poki co mam 5 w glowie

  • zgadnij liczbe
  • tictactoe
  • mastermind (w sensie zgadnij 4 liczby w odpowiedniej kolejnosci)
  • arkanoid
  • warcaby/szachy

Tez mysle zeby wprowadzic jakis uzyteczny tool do napisania w C++ (ktory ja bym krok po kroku pisal). Jak np zliczalnie liini w danym folderze wszystkich plikow cpp i h

Jakbyscie mieli jakies pomysly (zeby poczatkujacy to zrozumieli i mogli wykorzystac) to byloby fajnie jakbyscie jakos mi podrzucili pomysly :) Niekoniecznie musza byc to gry. Po prostu ciekawe dosc male pomysly

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12270
0

Pozycja z arkanoidem będzie dobra; Pamiętam jak kumpel na studiach pisał go w C, więc powinno się przydać.

grzesiek51114
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2442
2

Ktoś bardzo początkujący, a do takich osób kierowany jest ten kurs, może mieć problem ze zrozumieniem mechaniki czegoś takiego jak Arkanoid. Ja sam pamietam, że jak zaczynałem od jakiejś tam książki do Pascala to naprawdę musiałem wczytywać się po parę razy w dzisiaj oczywiste rzeczy i nawet proste cwiczonka robilem dość długo. To musi być coś naprawdę prostego, żeby nie zniechęcić czytelnika. Myślę, że to Zgadnij liczbę będzie na początek w sam raz, bo nie ma tam zbyt wiele "skomplikowanej" logiki. Pamiętajmy, że ten kurs mogą czytać nie tylko ścisłowcy ale też ludzie, dla których układ współrzędnych to już coś w miarę dużego :-) Później można zacząć od czegoś bardziej złożonego ale na tym etapie wiele osób może po prostu nie pojąć tematu. Szkoda by było.

A sam kurs naprawdę fajnie się czyta :-)

@fasadin: a z przykładowych projektów to możesz po prostu zaproponować jakąś bazę danych opartą na obiektach. Jakąś księgarnie, katalog płyt z muzyką, dzienniczek ucznia... coś prostego co pozwoli zrozumieć klasy i podstawy obiektowosci takie jak kompozycja czy agregacja chociażby. Można później wpleść w to polimorfizm tworzac abstrakty takie jak klasy typu ksiazka czy osoba etc. To sa typy prostych projektów, które pozwolą rozebrać obiektówkę na kawałki, bo od razu widać w nich zależności pomiędzy klasami.

PS: Tę książkę jeszcze mam. Nazywa się Turbo Pascal 7.0 - szkoła programowania, pana Ryszarda Jarży. Była do tego nawet dyskietka z wszystkimi programami z książki :-)

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12270
2

Warto by było też znaleźć listę programów do zrobienia, tę, którą poleca się początkującym; Swego czasu miałem link do repo w GitHub, ale gdzieś się zapodział i trzeba by użyć wyszukiwarki; Z takiej listy można spokojnie powybierać co ciekawsze programy według stopnia zaawansowania i nie martwić się ich wymyślaniem;

@fasadin - jeśli już chcesz pokazywać w kursie jakieś programy, to bez względu na stopień ich skomplikowania, staraj się prezentować dobre praktyki; Przede wszystkim jeśli chodzi o formatowanie kodu i używanie tylko i wyłącznie angielskich słówek (np. dla identyfikatorów).

PR
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Pomorskie (Stare Kabaty)
0

Hmmm. No do przedstawienia dziedziczenia jak znalazł by był konsolowy RPG. Hierarchia klas broni/zbroi by imo dosyć fajnie przedstawiała jak można tego użyć.

nalik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1039
1
fasadin napisał(a):

Chce od czwartego rozdzialu pokazac pare projektow i rozwijac je (rozszerzac je, pisac bardziej obiektowo, dopisywac funkcjonalnosci etc). Poki co mam 5 w glowie

  • zgadnij liczbe
  • tictactoe
  • mastermind (w sensie zgadnij 4 liczby w odpowiedniej kolejnosci)
  • arkanoid
  • warcaby/szachy

Tak klasycznie:

  • Czat albo klient irc
  • Sudoku
  • Tetris
  • Tool do kompresowania plikow, kody hufmana albo lz77
grzesiek51114
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2442
0

Ech... mówiąc szczerze jak tak to czytam to z jednej strony cieszę się, że już nie jestem początkujący. Nie dlatego, że kurs jest źle napisany. Broń Boże! Jest bardzo fajny i świetnie się czyta. Bardziej dlatego, że jak pomyślę, że miałbym się teraz tego wszystkiego uczyć od nowa...

A z drugiej strony... Kiedy zaczynałem uczyć się na poważnie programowania to zawsze siedziało dla mnie w tym coś... intrygującego, nieodkrytego... tak, ze trochę tęskni się za tym uczuciem, które towarzyszy początkującej osobie, która dopiero w to wszystko w chodzi i jest wszystkiego ciekawa. :)

@fasadin jak tam dalsza część, bo nie mogę się doczekać? :)

  • Rejestracja: dni
  • Ostatnio: dni
0

Jeśli twierdzisz że nie masz czego się uczyć i wiesz już wszystko, to znaczy że w istocie wiesz niewiele. Albowiem, im więcej się uczysz tym bardziej uświadamiasz sobie jak mało wiesz.

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
0

nie umarlem, bylem chory :( tak bardzo nic nie robilem caly tydzien

wersja (bardzo robocza) mozna znalezc tutaj
http://pastebin.com/h61QD5e1

zapewne za 2-3 godziny wrzuce juz poprawiona jezeli chodzi o gramatyke i stylistyke. Mam nadzieje, ze nie ma babli merytorycznych

grzesiek51114
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2442
1

@fasadin dobrze, że jednak zdecydowałeś się na tę prostą grę w zgadywankę. Bardziej skomplikowane rzeczy pomieszałyby bardzo początkującym osobom w głowach.

Jeszcze dobrze byłoby nauczyć Twoich czytelników odpowiedniego nazewnictwa metod, klas, pól składowych etc... wiesz... żeby wiedzieli, że np. bool oznacza sie jako np. isChecked, a nie checker itd. :-)

Chyba, że to już jest i nie pamiętam ale o drugiej w nocy raczej nie będzie mi się chciało sprawdzać :-)

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
0

nazywanie odpowiednich metod na isChecked etc to dopiero w rozdziale 6, gdy opowiem o parametrach i zwracajacych wartosciach.

Na chwile obecna robocza (bardzo robocza) wersja rodzialu 5

http://pastebin.com/aCNmkN7q

na weekendzie zapewne poprawie literowki i niejasnosci. Jezeli cos wylapiecie nawet w tej wersji bardzo roboczej to prosze jak zawsze o feedback

Wolam @grzesiek51114 bo widze ze jemu kurs sie bardzo podoba :) A dzieki temu mam wieksza motywacje by pisac kolejne rozdzialy.

grzesiek51114
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2442
1

@fasadin tak na szybko:

  • bardzo super wydajnym kodem - starczy po prostu bardzo wydajnym kodem
  • to to się chyba nawet nie skompiluje:
Kopiuj
class ApplicationView
{
public:
    // Zamien nazwę na `controller`, bo nawet na forum widziałem posty o tym,
    // że coś się nie kompiluje, bo nazwa klasy jest z małej litery etc...
    // Po prostu pomiesza się czytelnikowi obiekt z nazwą klasy.
    ApplicationController applicationController;
    bool isPlaying = true;
    ApplicationView()
    {
        cout << "Gra w zgadnij liczbe \n";
    }
    Play()
    {
        cout << "Zgadnij liczbe pomiedzy 1 a 100. \n";
        applicationController.Play();
        if (applicationController.isPlaying == false)
        {
            Finish();
        }
    }
    Finish()
    {
        cout << "Zgadles! potrzebowales " << applicationController.howManyTries << " prob";
        isPlaying = false;
    }
};

Poza tym ApplicationView ma metodę Play tak jak w klasie ApplicationController? Popierdzieli im się kontroler z widokiem. Na bank! :D
Pamiętaj, że czytają to początkujący.

Zamiast Play i Finish dałbym kolejno Show i Quit. Poza tym powtarzasz się: skoro klasa ``ApplicationControllerposiada publiczne poleisPlayingto dlaczego by z niego nie skorzystać zamiast tworzyć nowe w klasieApplicationView` :)

W ogóle wpadłem na pomysł, żebyś poprosił jakiegoś kompletnego laika o przeczytanie Twojego kursu. Tylko musiałaby to być osoba, która jednak trochę się tym interesuje, bo inaczej nic z tego nie będzie, a chodzi o to, żeby po prostu na podstawie tego co zrobiłeś spróbowała coś napisać i określić się czy to jest w ogóle zjadliwe :)

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12270
6
fasadin napisał(a)

nazywanie odpowiednich metod na isChecked etc to dopiero w rozdziale 6, gdy opowiem o parametrach i zwracajacych wartosciach.

Jeśli trzeba wykorzystać coś, co będzie dokładnie omawiane w dalszej części kursu, to korzysta się z tego od razu (żeby nie uczyć złych praktyk) oraz dopisuje, że zostanie to wyjaśnione w kolejnych lekcjach;

A tak to najpierw uczysz źle, potem to prostujesz, a czytelnik ma mętlik w głowie :]

DR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1135
0

@fasadin Wydaje mi się, że powinieneś dopisać, że można tak tylko z typami całkowitymi. Tzn. inicjalizacja pól klasy, chyba, że znowu coś źle pamiętam

Kopiuj
 class Application 
{
public:
    int numberToGuess = 23; //tutaj
    int howManyTries = 0; //tutaj
    Application()
    {
        cout << "Gra w zgadnij liczbe \n";
    }
};
fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
Endrju
  • Rejestracja: dni
  • Ostatnio: dni
5

**:-o

Kopiuj
    for (int i = 0 ; i < 6 ; i = i + 1)
    {
        Person person {"lastName"+i , "name" + i, i+3};
        people.push_back(person);
    }

Undefined behavior.

Chyba jednak trzeba by skonwertować te liczby na std::string przed dodawaniem.

Wyjaśnienie UB:
"name" jest tablicą typu const char[5]. W wyrażeniu "name" + i tablica ta jest konwertowana na wskaźnik do pierwszego elementu. Następnie do tego wskaźnika dodawany jest offset i. W ostatniej iteracji jest więc "name" + 5. Jest to wskaźnik na jeden element char (jeden bajt) za tablicą "name". Ten wskaźnik jest przekazywany do konstruktra klasy std::string, który wykonuje jego dereferencję (UB) i próbuje odczytać z tego miejsca c-string.

ŁF
  • Rejestracja: dni
  • Ostatnio: dni
3

Popracuj nad językiem polskim (i ogonkami):
"Jest ono na tyle duże" - zagadnienia są szerokie
"ze zostały" - że
"jest to, ze Ty" - że
"wymieniona książkę" - ąę
"Mimo, ze " - że + http://www.prosteprzecinki.pl/przecinek-przed-mimo-ze-mimo-iz
"Więc, dlaczego" - bez przecinka
"będzie pisał swoim stylem to zrobi się bałagan" - za to tu zjedzony (przed "to")
"nie będzie wstanie" - wstanie następuje po leżeniu
"nie będzie wstanie czytać kodu na tyle efektywnie co ten gdy pisała swoim stylem" - to chyba nie po polsku (jak tego, który pisała swoim stylem) + przecinek ku**a
"wchodzimy do pokoju kolegi to na początku" - przecinek
"domyślać się gdzie są" - przecinek
"Najważniejsze by w projekcie" - dwukropek
"- Pisać (...), - Trzymać (...) - nie pisać (...) - starać (...)" - po pierwsze zakończ punkty średnikami albo przecinkami, po drugie skoro na końcu punktu nie znajduje się kropka, to następny punkt rozpoczynasz małą literą
"starać pisać się" - to po nie polsku
"Wcięcia w kodzie, mogą być przeróżne. Jedni używają tabulatora inni spacji." - przecinek jest, ale w złym zdaniu.
Ad Formatowanie kodu - widziałeś kiedyś IDE, w którym tab (#8) miałby szerokość inną niż cztery znaki?
"często w przykładach widzimy" - zdania rozpoczyna się wielką literą.

Dalej już mi się nie chce wytykać błędów. Usiądź nad swoimi tekstami, przeczytaj je uważnie i popoprawiaj losowo powstawiane przecinki oraz inne błędy interpunkcyjne i gramatyczne. Może jakiś tutorial pisania tutoriali się przyda? ;-)

ŁF
  • Rejestracja: dni
  • Ostatnio: dni
2

Dlaczego warto pisać kod po angielsku - zauważ, że wszystkie słowa kluczowe języka, konwencja nazewnicza, wszystkie biblioteki systemowe i niemal wszystkie frameworki, pluginy, rozszerzenia i biblioteki są pisane w języku angielskim. Mieszanie dwóch języków wygląda fatalnie, wychodzi ponglish, niezrozumiały bełkot ( ).

Sensowne nazywanie klas - SOLID odnosi się raczej do zawartości klas niż do nazewnictwa. Nazwy powinny opisywać do czego służy klasa/metoda/zmienna tak dobrze, jak to możliwe, a jednocześnie być jak najkrótsze. Wymyślanie dobrych nazw to czasem 50% czasu pracy programisty. Nazwy powinny być spójne, czyli elementy służące do czynności podobnego typu powinny mieć taki sam wzorzec nazwy (np. Is* dla booli, np. IsThisNameCorrect, Get* dla metod służących do pobierania czegośtam, np. GetCorrectName(), metody zawierają czasownik w nazwie, zmienne go nie zawierają itp. itd.).

ŁF
  • Rejestracja: dni
  • Ostatnio: dni
4

5.1 - ogólne zasady pisania kodu
5.2 - job twoju mat instrukcja break. WTF?

5.2 => 6

Wracając do formatowania kodu - dobrze byłoby zobaczyć przykładowe formatowania wraz zaprezentowaniem odpowiednich konwencji nazewniczych, a obok nich przykłady formatowania nieczytelnego i osobno spieprzonego nazewnictwa.

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
0

dzieki wielkie za feedback!

W nastepnej lekcji chcialem opisać o metodach (referencje, parametry, zwracanie, definiowane w innym pliku) oraz wyjasnienia zawilosci z poprzednich rozdziałow (oczywiscie tyle te ktore beda zrozumiale)

Ale przed tym spedze troche czasu na poprawienie + dodanie paru rzeczy, takze sądzę, że kolejna lekcja o metodach/funkcach bedzie gdzies na poczatku kwietnia (do 3 tygodnii).

Dzieki jeszcze raz za feedback :) Jak dla mnie to jest motywujace :)

ŁF
  • Rejestracja: dni
  • Ostatnio: dni
5

`void SetSides() // Nazwa funkcji to SetSides.
{
// tu sie cos dzieje, nie ważne co
}

void area()
{
// tu sie cos dzieje, nie ważne co
}konsekwencja - albo SetSides i Area, albo setSides i area. BTW nazwa Area jest zła dla metody. Metoda coś ROBI, więc w nazwie powinien być czasownik (zauważ, że nazwa SetSides jest OK, acz nazwa sugeruje, że powinna przyjmować jakiś argument).Area` to nazwa dla zmiennej, zresztą też dość słaba.
Aaa i "nieważne". Razem.

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
3

Spróbuj narzędzia Language Tool (https://languagetool.org/pl/), kompetentnie sygnalizuje błędy gramatyczne, frazeologiczne, ortograficzne oraz literówki. Sugeruje również sposób poprawy.
Przyznam się, nie czytałem Twojego kursu, ale widziałem ile usterek językowych wytknął Ci @ŁF.

ŁF
  • Rejestracja: dni
  • Ostatnio: dni
1

Pisałeś o DRY. Tymczasem podrozdział 5.6 zamykasz dwukrotnym złamaniem tej zasady (duplikujesz wypisywanie danych Kowalskiego).
IMHO naturalnym krokiem po zdefiniowaniu metod "FindKowalski*" powinno być dopisanie metody znajdującej dowolną osobę po nazwisku, czyli FindPersonBySurname, wtedy dopiero widać, że ten samouczek zmierza do pokazania czegoś praktycznego (no bo na co mi metoda szukająca zawsze tych samych danych?). Kolejnym krokiem jest zadziałanie zgodnie z literką S z SOLID - zrobienie GetPersonBySurname zwracającej naszego kowalskiego i PrintPersonData wypluwającej dane tegoż. A na koniec mógłbyś się pokusić o pokazanie perspektywicznego myślenia - co się stanie, jeśli Kowalskiego nie będzie, albo będzie ich dwóch - i zrobić GetFirstPersonBySurname (taka nazwa rozwiązuje problem "a co będzie, jeśli będzie dwóch Kowalskich") zwracającą null czy tam jakiś inny magic value oznaczający nieobecność szukanego elementu + ewentualne omówienie innych rozwiązań (rzucanie wyjątkiem, zwracanie false).
To już słabo będzie wiązać się z "break", ale możesz z tego przecież zrobić osobne podrozdziały - "implementacja DRY", "implementacja SOLID", "jak myśleć perspektywicznie".
Wybacz moje czepialstwo, po prostu chciałbym, żebyś zrobił całość nie dobrze, a bardzo bardzo dobrze.

ŁF
  • Rejestracja: dni
  • Ostatnio: dni
0

" a znak nowej linii robimy za pomoca "\n"" - a gucio. Inaczej jest na win, inaczej na ugryzionym jabłku, inaczej na linuksie. Przydałaby się jakaś gwiazdka z doprecyzowaniem, a najlepiej zamiast \n użyj odpowiedniej stałej czy w czym to C++ ma zdefiniowany ciąg odpowiedzialny za nl.

Endrju
  • Rejestracja: dni
  • Ostatnio: dni
3
ŁF napisał(a):

" a znak nowej linii robimy za pomoca "\n"" - a gucio. Inaczej jest na win, inaczej na ugryzionym jabłku, inaczej na linuksie. Przydałaby się jakaś gwiazdka z doprecyzowaniem, a najlepiej zamiast \n użyj odpowiedniej stałej czy w czym to C++ ma zdefiniowany ciąg odpowiedzialny za nl.

Nie.

Dla strumieni w trybie tekstowym '\n' w C/C++ oznacza znak końca linii. Niezależnie od systemu. Implementacja ma zadbać o jego prawidłową zamianę na co potrzeba.

(C11: 7.21.2/2, C++ jest kompatybilny z C pod tym względem)

MG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

Witaj Fasadin. A mógłbyś mi przedstawić dlaczego uważasz, że Zelent uczy złych nawyków?

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
2

Czesc @MariuszG
przeczytaj sobie ten watek wraz z komentarzami
http://4programmers.net/Forum/1226486

MG
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

Okejka, już wszystko wiem. Przerzucę się na 4programmers.net :)
Tutaj mam okazję poczytać dużo lepszychj opinii niż na kanale Zelenta. Nawet tam znalazłem jedno spostrzeżenie użytkownika na temat jego nauczania. Na początku nie posłuchałem bo to tylko jeden komentarz i każdy może mieć swoje zdanie, teraz trochę poszukałem, użyłem google i znalazłem. Cieszę się, że dowiedziałem się o tym na początku bo już całkowicie zacząłem używać zmiennych globalnie, nie widziałem sensu używać go jedynie w funkcjach. To zły znak. Jeszcze raz dzięki i łap "lajkonika" za pomoc.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.