November 22, 2025, Saturday, 325

Języki Programowania 8

From MJanik

(Difference between revisions)
Jump to: navigation, search
 
(15 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.
 +
 +
 +
 +
-
[http://www.if.pw.edu.pl/~majanik/data/JP/2012/makefile.pdf Makefile - instrukcja]
 
<hr />
<hr />
-
---+ Kontener STL <code>std::vector</code>
+
''' <u>Kontener STL <code>std::vector</code> </u>
-
---++ Czym jest <code>std::vector</code>?
+
''' 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.   
<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.   
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)).
Dostarcza szybki dostęp do elementów przez indeks (operacja O(1)) oraz efektywne dodawanie na końcu (amortyzowane O(1)).
-
---++ Najważniejsze cechy
+
''' Najważniejsze cechy
   * Elementy są przechowywane w kolejności dodania.
   * Elementy są przechowywane w kolejności dodania.
   * Rozmiar może się zmieniać w trakcie działania programu.
   * Rozmiar może się zmieniać w trakcie działania programu.
Line 18: Line 84:
   * Posiada bogaty zestaw metod do modyfikowania zawartości.
   * Posiada bogaty zestaw metod do modyfikowania zawartości.
-
---++ Najczęściej używane metody
+
''' Najczęściej używane metody
   * <code>push_back(x)</code> – dodaje element na końcu.
   * <code>push_back(x)</code> – dodaje element na końcu.
   * <code>pop_back()</code> – usuwa ostatni element.
   * <code>pop_back()</code> – usuwa ostatni element.
Line 26: Line 92:
   * <code>begin()</code>, <code>end()</code> – iteratory pozwalające przechodzić po wektorze.
   * <code>begin()</code>, <code>end()</code> – iteratory pozwalające przechodzić po wektorze.
-
---++ Przykład użycia
+
''' Przykład użycia
-
<verbatim>
+
-
#include <vector>
+
-
#include <iostream>
+
-
int main() {
+
#include <vector>
 +
#include <iostream>
 +
 +
int main() {
     std::vector<int> liczby;
     std::vector<int> liczby;
-
 
     liczby.push_back(10);
     liczby.push_back(10);
     liczby.push_back(20);
     liczby.push_back(20);
     liczby.push_back(30);
     liczby.push_back(30);
-
 
     for (size_t i = 0; i < liczby.size(); i++) {
     for (size_t i = 0; i < liczby.size(); i++) {
         std::cout << liczby[i] << std::endl;
         std::cout << liczby[i] << std::endl;
Line 43: Line 107:
     return 0;
     return 0;
-
}
+
}
-
</verbatim>
+
-
---++ Kiedy używać <code>std::vector</code>?
+
''' Kiedy używać <code>std::vector</code>?
   * Gdy potrzebujesz dynamicznej tablicy.
   * Gdy potrzebujesz dynamicznej tablicy.
   * Gdy kluczowy jest szybki dostęp do elementów.
   * Gdy kluczowy jest szybki dostęp do elementów.
Line 52: Line 115:
   * Gdy zależy Ci na prostocie i efektywności.
   * Gdy zależy Ci na prostocie i efektywności.
-
---++ Zalety
+
''' Podsumowanie
-
  * 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
+
<code>std::vector</code> to najczęściej używany kontener STL dzięki swojej wydajności, elastyczności i intuicyjności.   
<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++.
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)