C/C++

Programowania w językach C i C++ — te materiały wykładowe dedykowane są dla osób, które miały wcześniej styczności z programowaniem. Dla osób, które wcześniej nie programowały przeznaczone są materiały w sekcji C++ od podstaw.

Materiały te są dedykowane dla z przedmiotu Języki programowania obiektowego (2-gi semestr UŚ) oraz Podstawy Programowania Obiektowego (2-szy semestr WSTI, z pominięciem elementów nieobiektowych). Ściągnij, wydrukuj, przyjdź na wykład z wydrukiem, będzie mniej pisania. Materiały to dokumenty PDF.

Przejdź do strony ćwiczeń

Nieobiektowe elementy języka C++

  • Wprowadzenie — trochę nietypowy wykład wprowadzający, przypomina podstawowe pojęcia i zasady stojące u podstaw programowania — kod maszynowy, asembler, kompilator, interpreter, maszyna wirtualna, kompilacja dla jezyka Java vs. kompilacja dla języków C/C++. Dalsza cześć wykładu prezentuje genezę i historię rozwoju języków C i C++, polecaną literaturę oraz informacje o sugerowanych narzędziach do programowania w językach C/C++.
  • Struktura programu — wykład prezentuje strukturę programu w językach C i C++, znaczenie funkcji main, rolę i zastosowanie plików nagłówkowych, koncepcje preprocesora, wykorzystanie obiektów cin i cout do realizacji podstawowych operacji wejścia-wyjścia. Istnieje wersja tego wykładu dla osób, które wcześniej nie programowały, zobacz: podstawy programowania — pierwsze programy.
  • Instrukcje — wykład prezentuje instrukcje sterujące wykonaniem programu, dostępne w językach C i C++ (if, if-else, while, do-while, for, switch, break, continue) oraz przykłady ich wykorzystania. Istnieje wersja tego wykładu dla osób, które wcześniej nie programowały, zobacz: podstawy programowania — instrukcje.
  • Typy, operatory, wyrażenia — wykład prezentuje zasady budowania identyfikatorów, podstawowe typy proste, role modyfikatorów signed, unsigned, long, short, typy wyliczeniowe, operatory i przykłady ich wykorzystania, zasady budowania wyrażeń, w tym wykorzystanie operatorów bitowych.
  • Funkcje — wykład poświęcony jest omówieniu podprogramów, ich typów, roli parametrów i metod ich przekazywania. Omówiono nie występujący jawnie w C/C++ podział na procedury i funkcje. W ramach wykładu przedstawiono również krótkie informacje na temat przeciążania funkcji, funkcje inline, parametry domyślne i funkcje ze zmienną liczbą parametrów. Uzupełnieniem są wykłady poświęcone preprocesorowi oraz klasom pamięci oraz budowaniu programów wielomodułowych. Uwaga — te zagadnienia są bardzo istotne a zwykle brakuje czasu na ich omówienie.
  • Tablice, koncepcja, reprezentacja, przetwarzanie — wykład poświęcony jest prezentacji koncepcji i metod wykorzystania tablic w językach C i C++. Przedstawiono różne postacie definiowania zmiennych tablicowych, ich inicjalizację, metody iteracyjnego przetwarzania. Przedyskutowano różnice występujące w C89, C99 i C++. Realizacja operacji na tablicach została zilustrowana programami przykładowymi, przedstawionymi w rożnych wersjach. Kody programów przykładowych można ściągnąć stąd. Istnieje wersja tego wykładu dla osób, które wcześniej nie programowały, zobacz: podstawy programowania — tablice.
  • Tablice znaków — wykład prezentuje koncepcję reprezentacji napisów w języku C/C++. Omówiona została rola znacznika końca napisu oraz podstawowe algorytmy przetwarzania tablic znakowych, wraz z przykładowymi implementacjami wybranych funkcji standardowych — m.in. strlen, strcpy, strcat, strupr, strlwr, strrev.
  • Zmienne wskaźnikowe, koncepcja, podstawowe zastosowania — wykład przedstawia koncepcję zmiennych wskaźnikowych, sposób ich definiowania, inicjalizowania, odwoływania się do obiektów wskazywanych. Przedstawiono także podstawowe zastosowania zmiennych wskaźnikowych — wykorzystanie zmiennych wskaźnikowych do przekazywania parametrów przez „zmienną” oraz dynamiczny przydział pamięci dla pojedynczych obiektów z wykorzystaniem operatorów new i delete. Wykład prezentuje równiez wykorzystanie wskaźników do funkcji. W suplemencie przedstawione funkcje z biblioteki języka C: malloc i free.
  • Wskaźniki a tablice — wykład poświęcony jest omówieniu powiązań występujących pomiędzy zmiennymi wskaźnikowymi a nazwami tablic. Po przedstawieniu koncepcji reprezentacji fizycznej tablic, przedstawione zostały przykłady wykorzystania analogii pomiędzy zmiennymi tablicowymi a zmiennymi wskaźnikowymi, głównie na przykładzie wskaźnikowych implementacji funkcji operujących na łańcuchach znakowych. Zaprezentowano także możliwości wykorzystania zmiennych wskaźnikowych oraz dynamicznego przydziału pamięci do tworzenia tablic pseudodynamicznych. Przedyskutowano metody realizacji tego typu tablic w języku C i C++.
  • Przetwarzanie plików na poziomie stdio, wprowadzenie — wykład poświęcony jest koncepcji reprezentacji plików w języku C, prezentuje metody wykorzystania standardowej biblioteki obsługi plikowego wejścia-wyjścia. Przetwarzanie plików na poziomie stdio, pliki operacje blokowe — wykład poświęcony jest koncepcji przetwarzania z wykorzystaniem amorficznych bloków, zaprezentowano metody wykorzystania funkcji fread oraz fwrite.
  • Struktury czyli rekordy w języku C i C++ — wykład poświęcony jest koncepcji reprezentacji rekordów w językach C i C++. Zaprezentowano koncepcję rekordu jako złożonej struktury danych opisujących złożone obiekty, zasady definiowania typów strukturalnych w C oraz C++, manipulowanie rekordami, przekazywanie rekordów jako parametrów funkcji. Uzupełnieniem jest wykład tablice i pliki struktur — poświęcony prezentacji przykładu wykorzystania trzech poznanych, złożonych struktur danych — tablic, rekordów i plików — jako narzędzia realizacji programu ewidencjonującego informacje o samochodach. Zobacz prosty program realizujący ewidencjonowanie danych o pojazdach autokomisu — źródłowy w postaci HTML, ściągnij program w wersji źródłowej.

Obiektowe elementy języka C++

Dostępny jest fragment skryptu z programowania obiektowego — łagodne wprowadzenie do programowania obiektowego w C++. Pełną wersję skryptu, obejmującą programowanie obiektowe w języku Java, C++, Python i Haskell można pobrać stąd.

  1. Wprowadzenie do programowania obiektowego — wykład prezentuje koncepcję programowania obiektowego przedstawioną na prostym przykładzie, zrealizowanym zarówno proceduralnie jak i obiektowo. Przedstawione zostały koncepcje: abstrakcji i hermetyzacji wraz z przykładami ich praktycznego zastosowania. Końcowa część wykładu zawiera przykładowe implementacje funkcje obsługi konsoli (ekran i klawiatura), można również pobrać przykładowe implementacje konsolowych funkcji pisania znaku, napisu, liczb, dedykowane dla kompilatorów Borlanda oraz GCC z MINGW, pierwszą wersję Runner in run dedykowaną dla kompilatorów Borlanda oraz GCC z MINGW, która zawiera definicję klasy Runner bez hermetyzacji.
  2. Definiowanie klas i obiektów — pierwsze kroki — wykład prezentuje implementację podstawowych koncepcji programowania obiektowego w języku C++. Przedstawiono jak definiować pola i funkcje składowe, reguły widoczności pól, organizację interfejsu klasy, koncepcję konstruktorów, ich rodzaje, role, zastosowania, różne metody ich implementacji. Wskazano rolę konstruktora kopiującego i sytuacje, w których jego właściwe zdefiniowanie jest konieczne. Omówiono koncepcję funkcji inline, przedstawiono rozbudowaną klasę Runner. Na końcu zamieszczono propozycje kilku prostych ćwiczeń do samodzielnego wykonania. Jako dodatek: druga wersja klasy Runner zawierająca definicję klasy Runner z hermetyzacją.
  3. Dziedziczenie — wprowadzenie — wykład wprowadzający w zagadnienie dziedziczenia i jego implementację w języku C++. Przedstawia praktyczną motywację dziedziczenia jako narzędzia wielokrotnego wykorzystania kodu, koncepcję dziedziczenia, notację UML wykorzystywaną dla dziedziczenia. W dalszej części wykładu zaprezentowano anatomię dziedziczenia w C++ — jak definiować klasy pochodne, co robić z konstruktorami, jak definiować nowe pola i funkcje składowe, na czym polega redefiniowanie funkcji składowych i do czego ono służy. Wprowadzono również pojęcie pól i funkcji statycznych oraz przedstawiono krótkie wprowadzenie do zagadnienia dziedziczenia wielobazowego, jednak bez wchodzenia w zagadnienia szczegółowe. Na końcu propozycje kilku prostych ćwiczeń do samodzielnego wykonania. Jako dodatek, rozwojowa wersja przykładu klasy Runner z wykorzystaniem dziedziczenia i kompozycji.
  4. Polimorfizm — wykład prezentuje koncepcję funkcji wirtualnych, omawia wiązanie statyczne i dynamiczne. Prezentuje manipulowanie obiektami w hierarchii klas z wykorzystaniem wskaźników i referencji, omawia upcasting i downcasting. Właściwa część wykładu poświęcona jest polimorfizmowy dynamicznemu w C++, całość ilustrowana jest praktycznymi przykładami. Można ściągnąć kod programu z klasą RunnerWithTrace.

Programowanie w środowisku GUI — krótkie wprowadzenie do WinAPI, C++ Builder i QT