From MJanik
(Difference between revisions)
|
|
| (8 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: | | W ramach przygotowania do zadania możesz: |
| | <ul> | | <ul> |
| - | <li> zapoznać się z plikiem: [http://www.if.pw.edu.pl/~majanik/data/JP/2012/makefile.pdf Makefile - instrukcja] i przygotować Makefile dla ostatnio pisanego programu | + | <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: | | <li> napisz klasę MojeLiczby, która zawiera pole stl::vector<int> liczby oraz metody: |
| | <ul> | | <ul> |
| Line 8: |
Line 14: |
| | <li> void clear() - usuwa wszyskie liczby dotychczas zapisane w wektorze | | <li> void clear() - usuwa wszyskie liczby dotychczas zapisane w wektorze |
| | </ul> | | </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. | + | <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 | + | Przykład wywołania programu: ./programLiczby 10 |
| - | </ul>
| + | Przykładowy efekt: 4 39 58 67 85 2 33 44 7 83 |
| | + | |
| | + | |
| | <hr /> | | <hr /> |
| | | | |
| Line 35: |
Line 43: |
| | CXX=g++ | | CXX=g++ |
| | CXXFLAGS=-Wall -O2 | | CXXFLAGS=-Wall -O2 |
| - | | + | |
| | main: main.o utils.o | | main: main.o utils.o |
| | $(CXX) $(CXXFLAGS) main.o utils.o -o main | | $(CXX) $(CXXFLAGS) main.o utils.o -o main |
| - | | + | |
| | main.o: main.cpp utils.hpp | | main.o: main.cpp utils.hpp |
| | utils.o: utils.cpp utils.hpp | | utils.o: utils.cpp utils.hpp |
| - | | + | |
| | clean: | | clean: |
| | rm -f *.o main | | rm -f *.o main |
| Line 106: |
Line 114: |
| | * Gdy dane często dodajesz na końcu kontenera. | | * Gdy dane często dodajesz na końcu kontenera. |
| | * Gdy zależy Ci na prostocie i efektywności. | | * Gdy zależy Ci na prostocie i efektywności. |
| - |
| |
| - | ''' Zalety
| |
| - | * Bardzo szybki dostęp do elementów.
| |
| - | * Kompaktowe przechowywanie danych w pamięci.
| |
| - | * Prosta obsługa i szerokie wsparcie w STL.
| |
| - |
| |
| - | ''' Wady
| |
| - | * Wstawianie elementów w środku jest kosztowne (przesuwanie danych).
| |
| - | * Przealokowanie podczas powiększania może czasem kosztować więcej czasu.
| |
| | | | |
| | ''' Podsumowanie | | ''' Podsumowanie |
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)