Dodatek A

Czym są biblioteki programistyczne

Biblioteka potocznie nazywa libką to plik w którym znajdują się podprogramy, dane i typy danych które mogą zostać użyte w innym podprogramie lub programie. Biblioteki nierozłącznie kojarzą nam się z plikami nagłówkowymi które to są swojskimi rodzaju spisami treści. Znajdują się tam nazwy funkcji których ciała są we właściwej bibliotece. Dobór odpowiednich „libek” umożliwia rozwiązanie niemal każdego problemu. Podpinając bibliotekę do naszego programu możemy korzystać z jej wszystkich zasobów co zdecydowanie ułatwia pracę.

Niezbędne biblioteki

C/C++

  • <stdio.h> / <iostream> strumienie wejścia wyjścia
  • <math.h> / <math> dostęp do funkcji matematycznych
  • <fstream.h> / <fstream> operacje na plikach tekstowych
  • <time.h> / <ctime> zegar procesora
  • <stdlib.h> / <cstdlib> konwertowanie stringów, liczby pseudolosowych 

Wymieniłem 5 podstawowych bez których praca byłaby niemożliwa oczywiście jest ich tysiące. Biblioteki to obsługi grafiki 2D, 3D, plików audio, napięcia wychodzącego, bazodanowe, komunikacyjne z serwerem/przeglądarką itp itd. Wybór oczywiście należy do indywidualnych preferencji użytkownika i zadania przed nim postawionego.

Typy danych

 

Oczywiście jest znacznie więcej typów zmiennych niż te przedstawione w tabeli. Tutaj znajdują się te najbardziej popularne. Język C/C++ umożliwia zwiększenie zakresu dwukrotnie za pomocą słowa signed rezygnując tym samym z przedziału liczb ujemnych. Python w odróżnieniu od umawianych języków ma mechanizm automatycznego wyboru typu zmiennych więc nie ma to większej różnicy. Oczywiście użytkownik może korzystać z funkcji rzutujących na określony typ. Tak na przykład funkcja int() będzie sprawiała że dana zmienna będzie tego typu, o ile to w ogóle możliwe. Warto wymienić tutaj jeszcze pozostałe funkcje: float(), char() czy str() która to rzutuje zmienna na typ string (łańcuch znaków, można to porównać to tablicy char).

Klasy i struktury w C/C++

Język C/C++ umożliwia tworzenie struktur czyli bardzo złożonych zmiennych. Struktura jest czymś na wzór pojemnika w którym są inne pojemniki (brzmi znajomo czyżby tablica?) które mogą być różne i posiadają indywidualne nazwy. Poniżej przedstawiam przykładową strukturę i proste operacje na niej.

#include <iostream>
using namespace std;

struct Czlowiek //nazwa struktury
{
    char imie[15]; //zbiór zmiennych w jej ciele
    char zawod[25];
    float wiek;
    int HP;
    bool plec;
};

int main()
{
  Czlowiek cz1 = {"Adam", "rycerz", 33.2, 250, 1} //inicjalizacja zmiennej
  Czlowiek cz2; //kolejna zmienna strukturalna
  cout<<"Podaj kolejno imie, zawod, wiek, HP i plec "<<endl;
  cin>>cz2.imie>>cz2.zawod>>cz2.wiek>>cz2.HP>>cz2.plec;
  cout<<cz2.imie<<" "<<cz2.HP<<endl;
  cout<<cz1.imie<<" i "<<cz2.imie<<" razem maja "<<cz1.HP+cz2.HP<<" punktow zycia"<<endl;
  return 0;
}

Oczywiście struktury mogą być znaczniej bardziej rozbudowane i mają szersze zastosowania niż te przedstawione w fragmencie kodu.

Poniżej przykładowa klasa w języku C++ w tym przykładzie jest w prowadzone bardzo dużo nowych rzeczy, aby je dokładnie przeanalizować i omówić należałoby zrobić o tym osobną lekcje ponieważ temat uważam za bardzo ciekawy i trudny do wyczerpania.

#include <iostream>
using namespace std;

class Potwor //nazwa klasy
{
private:
    string nazwa; //zbiór zmiennych w jej ciele
    int atak;   //wszystkie prywatne i niedostępne
    int HP;
public:
    Potwor() //konstruktor
    {
        nazwa = "szkieletor";
        atak = 15;
        HP = 45;
    }
    Potwor(string n, int a, int h) //kolejny konstruktor
    {
        nazwa = n;
        atak = a;
        HP = h;
    }
    ~Potwor(){} //destruktor
    void zaatakuj(Potwor *atakowany) //argumentem jest wskaźnik
    {
        atakowany->HP = atakowany->HP - this->atak;
    }
    string zwrocNazwe(){return nazwa;} //sposób na dostęp do zmiennych
    int zwrocHP(){return HP;}
    int zwrocAtak(){return atak;}
};

int main()
{
    Potwor p1; //korzysta z pierwszego konstruktora;
    Potwor *wsk; //wskaźnik
    wsk = &p1;
    Potwor p2 = {"wilkolak", 35, 150};
    cout<<wsk->zwrocNazwe()<<" ma "<<wsk->zwrocHP()<<" punktow zycia"<<endl;
    cout<<p2.zwrocNazwe()<<" ma "<<p2.zwrocAtak()<<" punktow ataku"<<endl;
    cout<<p2.zwrocNazwe()<<" atakuje "<<wsk->zwrocNazwe()<<endl;
    p2.zaatakuj(wsk);
    cout<<wsk->zwrocNazwe()<<" ma "<<wsk->zwrocHP()<<" punktow zycia"<<endl;
    return 0;
}

Nie ma sensu omawiać i analizować każdej linijki z osobna więc ten kod pozostawiam jako poglądowy, jeżeli zajdzie taka konieczność klasy można omówić bardziej dokładnie w osobnej lekcji. Warto dodać że użyto tutaj wskaźnika tak aby pracował on na oryginalnych zmiennych a nie kopiach a przedstawiony wynik był prawidłowy.