November 22, 2025, Saturday, 325

Języki Programowania 8

From MJanik

(Difference between revisions)
Jump to: navigation, search
(Blanked the page)
 
(17 intermediate revisions not shown)
Line 1: Line 1:
 +
[http://www.if.pw.edu.pl/~majanik/data/JP/2025/Zadanie8_Analyzer.pdf Zadanie 8 - Analyzer]
 +
[http://www.if.pw.edu.pl/~majanik/data/JP/2025/input.txt input.txt]
 +
 +
<hr />
 +
 +
W ramach przygotowania do zadania możesz:
 +
<ul>
 +
<li> zapoznać się z plikiem: [http://www.if.pw.edu.pl/~majanik/data/JP/2025/Makefile.pdf Makefile - instrukcja] i przygotować Makefile dla ostatnio pisanego programu
 +
<li> napisz klasę MojeLiczby, która zawiera pole stl::vector<int> liczby oraz metody:
 +
<ul>
 +
<li> void generuj(n) - generuje n liczb z zakresu 0-99 i wstawia je na koniec vecotr'a
 +
<li> void print() - wypisuje wszystkie liczby zapisane w wektorze
 +
<li> void clear() - usuwa wszyskie liczby dotychczas zapisane w wektorze
 +
</ul>
 +
<li> zmodyfikuj funkcję main w taki sposób, by przyjmowała jako argument ilość liczb które instancja (obiekt) klasy MojeLiczby ma wygenerować i wypisać na ekran. </ul>
 +
 +
Przykład wywołania programu:  ./programLiczby 10
 +
Przykładowy efekt: 4 39 58 67 85 2 33 44 7 83
 +
 +
 +
<hr />
 +
 +
'''<u> Makefile </u>
 +
 +
''' Czym jest Makefile?
 +
Makefile to plik konfiguracyjny używany przez narzędzie <code>make</code> do automatyzacji procesu kompilacji. 
 +
Pozwala definiować zasady budowania programu: które pliki należy skompilować, w jakiej kolejności i z jakimi poleceniami.
 +
 +
''' Po co stosować Makefile?
 +
  * Automatyzuje budowę programu (kompilacja, linkowanie, czyszczenie plików pośrednich).
 +
  * Skraca czas — kompilowane są tylko pliki, które zostały zmodyfikowane.
 +
  * Upraszcza pracę w dużych projektach z wieloma plikami źródłowymi.
 +
  * Pozwala definiować własne cele (targets), np. <code>make clean</code>.
 +
 +
''' Najczęstsze elementy Makefile
 +
  * *Cel (target)* – nazwa zadania, np. <code>main</code>.
 +
  * *Reguła (rule)* – określa zależności i polecenia, które mają zostać wykonane.
 +
  * *Zależności (dependencies)* – pliki, od których zależy dany cel.
 +
  * *Polecenia (commands)* – komendy wykonywane przez <code>make</code> (musi je poprzedzać tabulator!).
 +
 +
''' Przykładowy Makefile
 +
CXX=g++
 +
CXXFLAGS=-Wall -O2
 +
 +
main: main.o utils.o
 +
    $(CXX) $(CXXFLAGS) main.o utils.o -o main
 +
 +
main.o: main.cpp utils.hpp
 +
utils.o: utils.cpp utils.hpp
 +
 +
clean:
 +
    rm -f *.o main
 +
 +
 +
''' Kiedy używać Makefile?
 +
  * Gdy projekt składa się z więcej niż jednego pliku źródłowego.
 +
  * Gdy chcesz mieć powtarzalny i automatyczny proces budowania.
 +
  * Gdy potrzebujesz wygodnego sposobu zarządzania kompilacją i plikami pośrednimi.
 +
 +
''' Podsumowanie
 +
Makefile jest prostym, ale bardzo skutecznym narzędziem umożliwiającym automatyzację kompilacji w projektach C/C++. 
 +
Ułatwia zarządzanie kodem, oszczędza czas i pozwala utrzymać porządek w projekcie.
 +
 +
 +
 +
 +
 +
 +
 +
<hr />
 +
 +
''' <u>Kontener STL <code>std::vector</code> </u>
 +
 +
''' Czym jest <code>std::vector</code>?
 +
<code>std::vector</code> to sekwencyjny kontener z biblioteki STL, który przechowuje elementy w sposób ciągły w pamięci. 
 +
Umożliwia dynamiczne powiększanie i zmniejszanie rozmiaru podczas działania programu. 
 +
Dostarcza szybki dostęp do elementów przez indeks (operacja O(1)) oraz efektywne dodawanie na końcu (amortyzowane O(1)).
 +
 +
''' Najważniejsze cechy
 +
  * Elementy są przechowywane w kolejności dodania.
 +
  * Rozmiar może się zmieniać w trakcie działania programu.
 +
  * Zapewnia dostęp za pomocą operatora <code>[]</code> i metody <code>at()</code>.
 +
  * Posiada bogaty zestaw metod do modyfikowania zawartości.
 +
 +
''' Najczęściej używane metody
 +
  * <code>push_back(x)</code> – dodaje element na końcu.
 +
  * <code>pop_back()</code> – usuwa ostatni element.
 +
  * <code>size()</code> – zwraca liczbę elementów.
 +
  * <code>empty()</code> – sprawdza, czy wektor jest pusty.
 +
  * <code>clear()</code> – usuwa wszystkie elementy.
 +
  * <code>begin()</code>, <code>end()</code> – iteratory pozwalające przechodzić po wektorze.
 +
 +
''' Przykład użycia
 +
 +
#include <vector>
 +
#include <iostream>
 +
 +
int main() {
 +
    std::vector<int> liczby;
 +
    liczby.push_back(10);
 +
    liczby.push_back(20);
 +
    liczby.push_back(30);
 +
    for (size_t i = 0; i < liczby.size(); i++) {
 +
        std::cout << liczby[i] << std::endl;
 +
    }
 +
 +
    return 0;
 +
}
 +
 +
''' Kiedy używać <code>std::vector</code>?
 +
  * Gdy potrzebujesz dynamicznej tablicy.
 +
  * Gdy kluczowy jest szybki dostęp do elementów.
 +
  * Gdy dane często dodajesz na końcu kontenera.
 +
  * Gdy zależy Ci na prostocie i efektywności.
 +
 +
''' Podsumowanie
 +
<code>std::vector</code> to najczęściej używany kontener STL dzięki swojej wydajności, elastyczności i intuicyjności. 
 +
W większości przypadków stanowi zalecaną strukturę do przechowywania sekwencji danych w C++.
 +
 +
 +
<hr />
 +
 +
'''Parametry wywołania programu (zmiany w deklaracji funkcji main):
 +
 +
int main(int argc, char **argv){
 +
}
 +
Gdzie:
 +
argc - liczba parametrów, z którymi został wywołany program
 +
**argv - tablica parametrów (każdy jako char*):
 +
argv[0] - nazwa programu
 +
argv[1], argv[2]... - kolejne parametry wywołania programu
 +
 +
Np. wywołanie programu program mogło by mieć formę:
 +
./program Ala 3
 +
Wtedy:
 +
//argc == 4
 +
//argv[0] == "program"
 +
//argv[1] == "Ala"
 +
//argv[2] == "3"  ||  zmiana ”3” na 3 (liczbę) – funkcja atoi. np int a = atoi(”3”);  z biblioteka: <stdlib.h>
 +
Przyporządkowanie tych parametrów wykonuje się samoistnie w momencie wywołania programu, jedynym wkładem programisty jest zadeklarowanie funkcji main w formie int main(int argc, char **argv)

Latest revision as of 10:08, 21 November 2025

Zadanie 8 - Analyzer

input.txt


W ramach przygotowania do zadania możesz:

  • zapoznać się z plikiem: Makefile - instrukcja i przygotować Makefile dla ostatnio pisanego programu
  • napisz klasę MojeLiczby, która zawiera pole stl::vector<int> liczby oraz metody:
    • void generuj(n) - generuje n liczb z zakresu 0-99 i wstawia je na koniec vecotr'a
    • void print() - wypisuje wszystkie liczby zapisane w wektorze
    • void clear() - usuwa wszyskie liczby dotychczas zapisane w wektorze
  • zmodyfikuj funkcję main w taki sposób, by przyjmowała jako argument ilość liczb które instancja (obiekt) klasy MojeLiczby ma wygenerować i wypisać na ekran.
Przykład wywołania programu:  ./programLiczby 10
Przykładowy efekt: 4 39 58 67 85 2 33 44 7 83



Makefile

Czym jest Makefile? Makefile to plik konfiguracyjny używany przez narzędzie make do automatyzacji procesu kompilacji. Pozwala definiować zasady budowania programu: które pliki należy skompilować, w jakiej kolejności i z jakimi poleceniami.

Po co stosować Makefile?

  * Automatyzuje budowę programu (kompilacja, linkowanie, czyszczenie plików pośrednich).
  * Skraca czas — kompilowane są tylko pliki, które zostały zmodyfikowane.
  * Upraszcza pracę w dużych projektach z wieloma plikami źródłowymi.
  * Pozwala definiować własne cele (targets), np. make clean.

Najczęstsze elementy Makefile

  * *Cel (target)* – nazwa zadania, np. main.
  * *Reguła (rule)* – określa zależności i polecenia, które mają zostać wykonane.
  * *Zależności (dependencies)* – pliki, od których zależy dany cel.
  * *Polecenia (commands)* – komendy wykonywane przez make (musi je poprzedzać tabulator!).

Przykładowy Makefile

CXX=g++
CXXFLAGS=-Wall -O2

main: main.o utils.o
   $(CXX) $(CXXFLAGS) main.o utils.o -o main

main.o: main.cpp utils.hpp
utils.o: utils.cpp utils.hpp

clean:
   rm -f *.o main


Kiedy używać Makefile?

  * Gdy projekt składa się z więcej niż jednego pliku źródłowego.
  * Gdy chcesz mieć powtarzalny i automatyczny proces budowania.
  * Gdy potrzebujesz wygodnego sposobu zarządzania kompilacją i plikami pośrednimi.

Podsumowanie Makefile jest prostym, ale bardzo skutecznym narzędziem umożliwiającym automatyzację kompilacji w projektach C/C++. Ułatwia zarządzanie kodem, oszczędza czas i pozwala utrzymać porządek w projekcie.





Kontener STL std::vector

Czym jest std::vector? std::vector to sekwencyjny kontener z biblioteki STL, który przechowuje elementy w sposób ciągły w pamięci. Umożliwia dynamiczne powiększanie i zmniejszanie rozmiaru podczas działania programu. Dostarcza szybki dostęp do elementów przez indeks (operacja O(1)) oraz efektywne dodawanie na końcu (amortyzowane O(1)).

Najważniejsze cechy

  * Elementy są przechowywane w kolejności dodania.
  * Rozmiar może się zmieniać w trakcie działania programu.
  * Zapewnia dostęp za pomocą operatora [] i metody at().
  * Posiada bogaty zestaw metod do modyfikowania zawartości.

Najczęściej używane metody

  * push_back(x) – dodaje element na końcu.
  * pop_back() – usuwa ostatni element.
  * size() – zwraca liczbę elementów.
  * empty() – sprawdza, czy wektor jest pusty.
  * clear() – usuwa wszystkie elementy.
  * begin(), end() – iteratory pozwalające przechodzić po wektorze.

Przykład użycia

#include <vector> 
#include <iostream>

int main() {
   std::vector<int> liczby;
   liczby.push_back(10);
   liczby.push_back(20);
   liczby.push_back(30);
   for (size_t i = 0; i < liczby.size(); i++) {
       std::cout << liczby[i] << std::endl;
   }
   return 0;
}

Kiedy używać std::vector?

  * Gdy potrzebujesz dynamicznej tablicy.
  * Gdy kluczowy jest szybki dostęp do elementów.
  * Gdy dane często dodajesz na końcu kontenera.
  * Gdy zależy Ci na prostocie i efektywności.

Podsumowanie std::vector to najczęściej używany kontener STL dzięki swojej wydajności, elastyczności i intuicyjności. W większości przypadków stanowi zalecaną strukturę do przechowywania sekwencji danych w C++.



Parametry wywołania programu (zmiany w deklaracji funkcji main):

int main(int argc, char **argv){ 
} 

Gdzie:

argc - liczba parametrów, z którymi został wywołany program 
**argv - tablica parametrów (każdy jako char*): 
argv[0] - nazwa programu 
argv[1], argv[2]... - kolejne parametry wywołania programu 

Np. wywołanie programu program mogło by mieć formę:

./program Ala 3 

Wtedy:

//argc == 4 
//argv[0] == "program" 
//argv[1] == "Ala" 
//argv[2] == "3"   ||  zmiana ”3” na 3 (liczbę) – funkcja atoi. np int a = atoi(”3”);  							 z biblioteka: <stdlib.h>

Przyporządkowanie tych parametrów wykonuje się samoistnie w momencie wywołania programu, jedynym wkładem programisty jest zadeklarowanie funkcji main w formie int main(int argc, char **argv)