====== Języki i Metody Programowania 2 - Semestr letni 2015/2016 ======
* **Kierunek**: Informatyka
* **Rok**: I
* **Prowadzący**:
* [[http://home.agh.edu.pl/~kkutt/|mgr inż. Krzysztof Kutt]] (I połowa semestru)
* [[http://home.agh.edu.pl/~mslaz/|mgr inż. Mateusz Ślażyński]] (II połowa semestru)
===== Organizacja zajęć i zasady zaliczenia =====
* Ogólne zasady, które Państwa **obowiązują**: [[http://geist.agh.edu.pl/pub:teaching:gris|GRIS]] - proszę przeczytać, zrozumieć, ew. wątpliwości zgłosić na 1.-2. zajęciach
* Proszę zwrócić uwagę na sposób informowania Państwa o aktualnościach, tryb konsultacji, zasady dotyczące kolokwiów i obecności.
* Zajęcia w **pierwszej** części semestru prowadzi mgr inż. Krzysztof Kutt. \\ Zajęcia w **drugiej** części semestru poprowadzi mgr inż. Mateusz Ślażyński.
* **Ocena końcowa** jest średnią ocen z pierwszej i drugiej części semestru. Każdą z nich trzeba niezależnie od siebie zaliczyć.
===== WYNIKI =====
Poniższy {{:pl:dydaktyka:jimp2:2016:jimp2-ok.pdf|arkusz}} zawiera punktację z drugiej części laboratorium oraz podsumowanie: liczbę zdobytych punktów (procentowo) na obu częściach laboratorium oraz ich średnią wartość. Na tej podstawie wpisane są tam oceny końcowe z laboratorium.
===== I część: Podstawy programowania obiektowego w C++ =====
==== Harmonogram ====
^L.p.^ Termin ^ Laboratorium ^
^1.|25.02.2016|[[.:labs:wprowadzenie|Wprowadzenie do programowania w C++]]|
^2.|03.03.2016|[[.:labs:pamiec-i-pliki|Dynamiczne zarządzanie pamięcią i operacje na plikach]]|
^3.|10.03.2016|[[.:labs:klasy1|Klasy i obiekty I]]|
^4.|17.03.2016|[[.:labs:klasy2|Klasy i obiekty II]]|
^5.|31.03.2016|[[.:labs:operatory|Przeciążanie operatorów]]|
^6.|07.04.2016|[[.:labs:dziedziczenie|Dziedziczenie i polimorfizm]]|
^7.|14.04.2016|Kolokwium|
Laboratoria uzupełniające - **obowiązują na kolokwium!**
- [[.:labs:wskazniki|Wskaźniki i referencje]] - powtórka z C przed laboratorium [[.:labs:pamiec-i-pliki|Dynamiczne zarządzanie pamięcią i operacje na plikach]]
- [[http://home.agh.edu.pl/~gjn/dydaktyka/UGLX/node10.html|Makefile]] - opis budowania programów w środowisku UNIX, potrzebne do laboratorium [[.:labs:klasy1|Klasy i obiekty I]]
==== Zasady zaliczenia ====
* Na zaliczenie pierwszej części semestru składają się:
* Ćwiczenia na laboratoriach: 6 lab * 5 pkt = 30 pkt
* Kolokwium: 30 pkt
* Powyższe punkty stanowią 100% maksymalnej łącznej liczby punktów (MAX).
* Zgodnie z GRIS do wartości MAX nie wliczają się plusy za aktywność przyznawane za wykonanie odpowiednich ćwiczeń.
* 5 plusów = 1 pkt
* Rozwiązania zadań na **plusy** można przedstawić **TYLKO na zajęciach**.
* Rozwiązania zadań na **punkty** można przedstawić **na zajęciach albo przesłać mailem** na [[kkutt@agh.edu.pl]] przed kolejnymi zajęciami (najpóźniej minutę przed rozpoczęciem kolejnych zajęć; np. jeżeli jest się zapisanym do grupy w czwartek o 08:00, zadania można wysłać do 07:59 w dniu kolejnych zajęć).
* Na laboratorium można pracować **pojedynczo lub w parach**
=== Kolokwium ===
* Kolokwium rozwiązywane jest na kartkach (nie trzeba nic przynosić poza długopisem).
* Kolokwium trwa **60 minut**.
* Obowiązuje na nim materiał ze wszystkich laboratoriów (instrukcje + zadania na plusy i punkty).
* Jest 18 pytań za 1,2,3 punkty -- w sumie 30 pkt za całe kolokwium.
* Pytania za 1 pkt to pytania krótkiej odpowiedzi (min. 1 słowo, zwykle ok. 1 zdanie), np.: "Jakie znasz typy prymitywne (wbudowane) języka C%%++%%? Wymień co najmniej 8."
* Pytania za 2 pkt zawierają kawałek kodu w C%%++%%. Należy w nich albo odpowiedzieć na pytanie "co zostanie wyświetlone po uruchomieniu tego kodu" albo znaleźć błąd i go naprawić (błędy są w większości zaczerpnięte z programów oddawanych na laboratorium i przesyłanych na maila ;-) )
* Pytania za 3 pkt związane są z napisaniem kilku (ok. 5) linii kodu, np.: "Napisz ciało funkcji: ''void show(char[] filename);'' która wypisuje na ekranie cały plik o nazwie ''filename''. Białe znaki nie muszą być zachowane w oryginalnej formie (np. zamiast trzech spacji obok siebie może być tylko jedna spacja na ekranie).
* **Na kolokwium należy przyjść na grupę do której jest się zapisanym, zgodnie z listami ocen udostępnianymi przez prowadzącego**. Gdyby ktoś chciał przyjść na inną grupę, musi to zgłosić do prowadzącego najpóźniej **tydzień** przed kolokwium!
=== Zaliczenia poprawkowe ===
* Do zaliczenia poprawkowego **mogą przystąpić** osoby które:
* Nie mają zaliczenia lub
* nie pisały kolokwium i posiadają usprawiedliwienie (osoby takie mogą pisać tylko zaległe kolokwium/a).
* Do wyników uzyskanych z zaliczenia poprawkowego nie wlicza się:
* plusów/minusów - w 1. terminie poprawkowym,
* plusów/minusów i nieusprawiedliwionych nieobecności - w 2. terminie poprawkowym.
* W **2. terminie poprawkowym** można uzyskać co najwyżej ocenę 3.0.
===== II część: Szablony i kontenery w C++ =====
==== Sprawy Organizacyjne ====
Nie zmieściłyby się tutaj, więc proszę zajrzeć na [[.:part2:org:start|oddzielną stronę]].
==== Ćwiczenia ====
Zanim zaczniesz pisać program zapoznaj się z [[.:part2:org:codepolicy|wymaganymi konwencjami]]
^ L.p. ^ Tytuł ^ Czas trwania ^ Grupa ^ Deadline ^
^ 1. | [[.:part2:ex:ex1|Szablony funkcji]] | 1 tydzień | 2 os. | 28.04 |
^ 2. | [[.:part2:ex:ex2|Szablony klas]] | 1 tydzień | 2 os. | 05.05 |
^ 3. | [[.:part2:ex:ex3|Szablony + dziedziczenie]] | 1 tydzień | 2 os. | 12.05 |
^ 4. | [[.:part2:ex:ex4|Kontenery, cd.]] | 1 tydzień | 2 os. | 02.06 |
^ 5. | [[.:part2:ex:ex5|Iteratory]] | 1 tydzień | 2 os. | 09.06 |
^ 6. | [[.:part2:ex:ex6|Drzewa]] | Poprawa czerwcowa | 1 os | 29.06 |
==== Jak wysyłać wyniki ====
- Przetestować kod: g++ -std=c++11 *.cpp -o test && ./test
* :!: proszę użyć kompilatora ''gcc'' w wersji ''4.8.x'' (tak jak na serwerze borg)
* :!: proszę używać oryginalnego i niezmienionego pliku ''main'', np. ''ex1main.cpp'', ''ex2main.cpp'', etc.
- Jeżeli kod się nie kompiluje:
* proszę go **nie** wysyłać, nie ma po co
- Jeżeli kod się kompiluje:
- proszę stworzyć katalog o nazwie __, gdzie numer grupy ''0'' oznacza grupę o 08:00, a ''1'' grupę o 09:30, np. mkdir 0_Slazynski_Kutt
- skopiować istotne pliki do tego katalogu, np. cp *.cpp *.h ./0_Slazynski_Kutt
- proszę spakować folder do archiwum zip, rar, 7z, lub tar.gz, np. tar -zcf 0_Slazynski_Kutt.tar.gz 0_Slazynski_Kutt
- wysłać paczkę na mail [[mailto:mslaz@agh.edu.pl|mslaz@agh.edu.pl]] z tematem: ''[JIMP2] Ćwiczenie nr '', np. ''[JIMP2] Ćwiczenie nr 1''
- w treści wpisać imiona i nazwiska osób wykonujących ćwiczenie, np. ''Mateusz Ślażyński & Krzysztof Kutt''
- :!: załączyć archiwum z ćwiczeniem, to ważne :!:
- :!: nacisnąć przycisk wyślij i odczekać chwilę nie przerywając połączenia z internetem :!:
- dostać punkty z dobrze wykonaną robotę 8-)
- inne formy wysyłania zadań spotkają się z moją niechybną dezaprobatą i niekonstruktywną krytyką m(
* przewidywane kary w postaci składania własnoręcznie spisanej miażdżącej samokrytyki
* wizyta w worku pokutnym w dziekanacie pro
* no i brak punktów
==== Automatyczne formatowanie kodu ====
W celu uniknięcia braku punktów za dobry styl kodu, polecamy stosować narzędzia automatycznie formatujące kod. Większość profesjonalnych IDE, np. Eclipse, ma je wbudowane bądź dostępne w formie wtyczki. Jeżeli ktoś preferuje narzędzia konsolowe, to polecamy [[http://astyle.sourceforge.net/install.html|AStyle]], które jest dostępny na wszystkie wiodące systemy operacyjne. Narzędzi w użyciu jest bardzo proste: ''astyle <ścieżki do plików>'', np.
astyle --style=1tbs *.cpp *.h
sformatuje wszsytkie pliki ''.cpp'' i ''.h'' używając stylu One True Brace Style. Więcej dostępnych stylów i opcji można poznać czytając stronę [[http://astyle.sourceforge.net/astyle.html]].
Na potrzeby ćwiczeń polecamy stosować styl:
astyle -s4 -xG -S -O -n -o -k3 -H -p -j *.cpp *.h
Jeżeli kogoś przeraża wpisywanie tak wielu opcji, wystarczy zapisać konfigurację jako domyślną:
echo "-s4 -xG -S -O -n -o -k3 -H -p -j" > ~/.astylerc
=== Alternatywy ===
* [[http://uncrustify.sourceforge.net/|uncrustify]] - bardzo popularne narzędzie do formatowania kodu
* [[http://clang.llvm.org/docs/ClangFormat.html|clang-format]] - oparte o llvm narzędzie wspierane przez wiele narzędzi programistycznych. [[http://clangformat.com/|http://clangformat.com/]] pozwala generować dla niego konfiguracje.
* [[http://universalindent.sourceforge.net/|universalindent]] - graficzne narzędzie do formatowania kodu
===== Przydatne materiały =====
* [[http://www.cppreference.com/wiki/start|C++ Reference]]
* Harvey M. Deitel, Paul J. Deitel, //Arkana C%%++%%// - dla początkujących
* Jerzy Grębosz, //Symfonia/Pasja C%%++%%// - dla każdego
* Bjarne Stroustrup, //Język C%%++%%// - dla zainteresowanych
* [[https://fffaraz.github.io/awesome-cpp/|Awesome C/C++]] - A curated list of awesome C/C%%++%% frameworks, libraries, resources, and shiny things
Laboratoria dodatkowe - opcjonalne, ich znajomość nie jest wymagana do kolokwium. Just for fun :-)
- [[.:labs:wyjatki|Wyjątki]]
- [[.:labs:dziedziczenie-ex|Dziedziczenie i polimorfizm -- przykłady]]
- [[.:labs:stl|Biblioteka standardowa]]
==== Narzędzia ====
* Uniksowy kompilator **g%%++%%**
* [[http://www.eclipse.org/|Eclipse IDE for C/C++]]
* [[http://www.microsoft.com/express/Windows/|MS Visual Studio Express Edition]]
==== Platformy online z zadaniami do ćwiczenia programowania ====
* https://www.hackerrank.com/domains
* https://www.topcoder.com/login/?next=%252Fmy-dashboard%252F
* https://leetcode.com
* https://projecteuler.net
* http://pl.spoj.com/problems/latwe/