From MJanik
(Difference between revisions)
|
|
| (18 intermediate revisions not shown) |
| Line 1: |
Line 1: |
| - | Grupa poniedziałek 14:00 - 16:00
| + | [http://www.if.pw.edu.pl/~majanik/data/JP/2025/Zadanie8_Analyzer.pdf Zadanie 8 - Analyzer] |
| | | | |
| - | (kolokwium)
| + | [http://www.if.pw.edu.pl/~majanik/data/JP/2025/input.txt input.txt] |
| | | | |
| | + | <hr /> |
| | | | |
| - | Grupa wtorek 8:00 - 10:00
| + | 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> |
| | | | |
| - | [http://www.if.pw.edu.pl/~majanik/data/JP/2012/Zadanie8.BazaPracownikow.2.pdf Laboratorium 8 ]: klasa Baza i klasa Pracownik (operator <<, operator =, new, delete)
| + | 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)