Chciałem zamieścić taki mały zbiór skryptów, może komuś akurat będą przydatne do nauki.
Skrypty są w miare proste, zawierają komentarze i krótki opis działania. Polecam zajrzeć 🙂
Dodatkowo zamieszcze kilka funkcji.


1.)Standardowe wyświetlenie napisu

#include <iostream>			
#include <cstdio>			
using namespace std;       		
 
int main()				
{					
  cout << "Witaj swiecie"; 	
  getchar();				
  return 0;             		
}

Chyba najbardziej prosty skrypt, po wlączeniu wyświetla nam tekst zawarty w cout.
2.)Wczytywanie danych z klawiatury i wypisywanie na ekranie:

#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
  cout << "Ile masz lat? ";
  int lata;			// deklaracja zmiennej (1)
  cin >> lata;			// pobranie z klawiatury (2) 
				// wartości dla zmiennej lata
  cout << "Juz wiem: masz " << lata << " lat.";
  cin.ignore();  // instrukcja służy zignorowaniu ostatniego 'entera'
  getchar();
  return 0;
}

Wpisujemy numer, i dostajemy tekst + numer który podaliśmy.
3.)Instrukcja warunkowa if.

#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
  int liczba;				// deklaracja zmiennej
  cout << "Podaj liczbe ";
  cin >> liczba;			// przypisanie wartości z klawiatury
  if (liczba>0)				// instrukcja warunkowa
    cout << "Liczba jest dodatnia"; 	
  else
    cout << "Liczba nie jest dodatnia";
  cin.ignore();
  getchar();
  return 0;
}

Program sprawdza czy liczba jest dodatnia, i wyswietla nam informację.
4.)Program wyprowadzający na ekran monitora najmniejszą z trzech podanych wartości całkowitych:

#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
  int a, b, c;
  cout << "Podaj pierwsza liczbe ";
  cin >> a;
  cout << "Podaj druga liczbe ";
  cin >> b;
  cout << "Podaj trzecia liczbe ";
  cin >> c;
  if (a<b)
    if (a<c)
      cout << "Najmniejsza z podanych liczb jest "<< a;
    else
      cout << "Najmniejsza z podanych liczb jest "<< c;
  else
    if (c<b)
      cout << "Najmniejsza z podanych liczb jest "<< c;
    else
      cout << "Najmniejsza z podanych liczb jest "<< b;
  cin.ignore();
  getchar();
  return 0;
}

5.)Program wyświetlający liczby od 1 do 20, oznaczając liczby niepodzielne przez 3:

#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
  for (int i=0; i<20; i++) 
  {
    cout << i;
    if (i%3!=0)   // jeśli reszta z dzielenia przez 3 jest różna od zera
      cout << " - nie jest podzielne przez 3, ";
    cout << endl;
  }
  getchar();
  return 0;
}

6.)Pętla while. Wyświetlanie znaków aż do podania litery k.

#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
  char z;
  cout << "Podaj znak ";
  cin >> z;
  while (z!='k')
  {
    cout << "Podaj kolejny znak ";
    cin >> z;
  }
  cout << "Podales " << z << " wiec koncze";
  cin.ignore();
  getchar();
  return 0;
}

7.)Dzielenie całkowite zrealizowane za pomocą odejmowania dzielnika od dzielnej.

#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
  int a, b;  	// a–dzielna,  b–dzielnik
  int k = 0;  	// krotność
  cout << "Podaj dzielna i dzielnik ";
  cin >> a >> b;
  if (b==0)		// sprawdzenie warunku czy nie dzielimy przez zero
    cout << "Nie wolno dzielic przez zero!!!";
  else
  {
    while (a>=b) 	// tu rozpoczyna się właściwy algorytm dzielenia
    {
      a = a-b;
      k++;
    }
    cout << "a/b wynosi " << k;
  }
  cin.ignore();
  getchar();
  return 0;
}

8.)Program obliczający pole kwadratu o podanej długości boku:

#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
  float bok;
  do			// rób...
  {
    cout << "Podaj dodatnia dlugosc boku! ";  
    cin >> bok;		// zmiennej bok została przypisana wartość
    if (bok<=0)
      cout << "Niepoprawna dlugosc boku - podaj jeszcze raz!" << endl;
  }
  while (bok<=0);	// ...dopóki bok nie jest wartością dodatnią
  cout << "Pole kwadratu wynosi: " << bok*bok;
  cin.ignore();
  getchar();
  return 0;
}

9.)Instrukcja break. Wyświetlanie liczb parzystych, których suma nie przekracza 20.

#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
  int sum = 0;
  for (int i=0; i<10; i++)
  {
    cout << 2*i <<", ";
    sum = sum+2*i;
    if (sum>20) 
      break; // jeśli warunek spełniony, wyjście z pętli
  }
  cout << " Jestem poza petla"; //tu zaczyna się realizacja zadań
  getchar();
  return 0;
}

10.)Instrukcja continue. Wyświetlanie i opisywanie liczb niepodzielnych przez 3.

#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
  for (int i=0; i<5; i++)
  {
    cout << endl << i << ", ";;
    if (i%3==0)
      continue;	 // przy spełnieniu warunku przechodzimy
		 // natychmiast do kolejnego przebiegu pętli
    cout << " - nie jest podzielne przez 3,  ";
  }
  getchar();
  return 0;
}

11.)Wyznaczenie najmniejszej liczby z k liczb podanych na wejściu:

#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
  int  k, a, min;		// deklaracja zmiennych
  cout << "ile chcesz podac liczb - co najmniej jedna ";
  cin >> k;			// ilość liczb do wprowadzenia
  cout << "wprowadz liczbe ";
  cin >> a;			// wprowadzamy pierwszą liczbę
  min = a;			// i przyjmujemy ją jako bieżące minimum
  while (k>1)			// pętla będzie się wykonywała dopóki k>1
  {
    cout << "wprowadz liczbe ";
    cin >> a;			// wprowadzamy nastepną liczbę
    k--;			// zmniejszamy ilość liczb pozostałych do wprowadzenia
    if (a<min)   		// najważniejsza cześć programu
      min = a;		
  }				// koniec pętli
  cout << "najmniejsza wartosc w podanym ciagu to: " << min;
  cin.ignore();
  getchar();
  return 0;
}

12.)Badanie czy podana na wejściu liczba n jest liczbą pierwszą.

#include <iostream>
#include <cstdio>
using namespace std;
 
int main()
{
  int i = 2, n; 
  cout << "podaj liczbe calkowita wieksza od 1 ";
  cin >> n;
  while (n%i!=0 && i*i<=n)	// pętla skończy się jeśli jeden
    i++; 			// z tych warunków nie bedzie spełniony
  if (i*i<=n)
    cout << "liczba zlozona";
  else
    cout << "liczba pierwsza";
  cin.ignore();
  getchar();
  return 0;
}

13.) Funkcja obliczający średnią arytmetyczną dwóch liczb:

float srednia_aryt(float a, float b)	// typ_wyniku nazwa(parametry formalne)
{					// klamra otwierająca wnętrze funkcji
  return (a+b)/2; 	// wynikiem funkcji jest średnia arytmetyczna dwóch zmiennych
}					// klamra zamykająca wnętrze funkcji

Wywołanie w programie funkcji obliczającej średnią arytmetyczną:

include <iostream>
#include <cstdio>
using namespace std;
 
float srednia_aryt(float a, float b)
{
  return (a+b)/2;
}
 
int main()
{
  cout << "Srednia arytmetyczna liczb 2.7 i 5 = ";
  cout << srednia_aryt(2.7,5);
  getchar();
  return 0;
}

Inny przykład tej funkcji:

#include<iostream>
using namespace std;
int main ()
{
 int ilosc=0;
 float ocena;
 float srednia=0;
 
       cout<<"Podaj ocene: ( Wprowadzenie 0 konczy wprowadzanie )";
       cin>>ocena;
       if (ocena>0)
       {
        srednia=ocena*ilosc;
 
                   }
 
                   while (ocena!=0);
                   if(ilosc>0) srednia/=ilosc;
                   cout<<"Wprowadziles "<<ilosc<<" ocen"<<endl;
                   cout<<"Srednia ocen to: "<<srednia;
 
                   cout << "Nacisnij ENTER aby zakonczyc: ";
    return 0;
}

Wywołanie funkcji z podaniem argumentów w postaci zmiennych:

int main()
{
  float x, y;			// zmienne lokalne funkcji main
  cout << "Podaj dwie liczby: ";
  cin >> x >> y;
  cout << "Srednia arytmetyczna tych liczb wynosi: ";
  cout << srednia_aryt(x,y);
  cin.ignore();
  getchar();
  return 0;
}

14.)Bezparametrowa funkcja wykorzystująca zmienne globalne:

#include <iostream>
#include <cstdio>
using namespace std;
 
float a, b;		// zmienne globalne - wszystkie poniżej
			// zdefiniowane funkcje maja do nich dostęp
float srednia_aryt()  
{
  return (a+b)/2;	// funkcja srednia_aryt ma dostęp do a i b
}
 
int main()
{
  cout << "Podaj dwie liczby: ";
  cin >> a >> b;		// funkcja main ma dostep do a i b
  cout << "Srednia arytmetyczna tych liczb wynosi: " << srednia_aryt();
  cin.ignore();
  getchar();
  return 0;
}

15.)Program ilustrujący różne zakresy ważności zmiennych globalnych i lokalnych:

#include <iostream>
#include <cstdio>
using namespace std;
 
int a;		// zmienna globalna, znają ją wszystkie funkcje programu
 
void wyswietl()
{
  cout << "Bok kwadratu ma dlugosc: " << a;
}
 
float pole_kwadratu()
{
  return a*a;
}
 
float b;	// tę zmienną globalną znaja funkcje pole_prostokata i main
 
float pole_prostokata()
{
  int pole = a*b;	// zmienna lokalna funkcji pole_prostokata
  return pole;
}
 
int main()
{
  int c;		// zmienna lokalna funkcji main
  // tu znajduje sie dalsza treść funkcji głównej
}

16.)Funkcja obliczająca moduł liczby rzeczywistej:

float modul(float a)	// funkcja modul pobiera argument typu float
			// oraz zwraca wartość tego samego typu
{
  if (a>=0)
    return a; 
  else
    return -a;
}

17.)Program wykorzystujący funkcję obliczającą moduł liczby rzeczywistej:

#include <iostream>
#include <cstdio>
using namespace std;
 
float modul(float x)
{
  if (x>=0)
    return x; 
  else
    return -x;
}
 
int main()
{
  float  a, b;
  cout << "Podaj dwa punkty na osi: ";
  cin >> a >> b;
  cout << "Odleglosc pomiedzy punktami wynosi: " << modul(a-b);
  cin.ignore();
  getchar();
  return 0;
}

18.)Funkcja rysująca szlaczek. Długość i znak szlaczka są przekazywane jako argumenty:

void szlaczek_dowolny(int i, char znak)		
{
  for (int li=0; li<i; li++)		// li: zmienna pomocnicza
    cout << znak;    
}

Bezparametrowa funkcja rysująca szlaczek z 10 gwiazdek:

void szlaczek_10_gwiazdek(void)
{
  for (int p=0; p<10; p++)
    cout << "*";
}

19.)Przykład funkcji bezargumentowej, która ze swojego wnętrza pobiera potrzebne dane do narysowania szlaczka:

void szlaczek_inaczej()
{
  cout << "podaj, jaki znak mam rysowac";
  char znak;				// to jest zmienna lokalna funkcji
  cin >> znak;				// pobieramy informację, z jakich znakow
					// będzie się składał szlaczek
  cout << "ile mam narysowac znakow: " << znak << " ? ";  // długość szlaczka
  int ile;				// kolejna zmienna lokalna funkcji
  cin >> ile;				// pobieramy informację, z ilu znakow
					// będzie się składał szlaczek
  for (int p=0; p<ile; p++)
    cout << znak;			// rysowanie szlaczka
}

20.)Program wykorzystujący funkcje rysowania szlaczków:

#include <iostream>
#include <cstdio>
using namespace std;
 
/***************** Definicje funkcji ******************/
void szlaczek_10_gwiazdek(void)
{
  for (int p=0; p<10; p++)
    cout << "*";
  cout << endl;
}
 
void szlaczek_dowolny(int i, char znak)
{
  for (int li=0; li<i; li++)
    cout << znak;
  cout << endl;
}
 
void szlaczek_inaczej()
{
  cout << "Podaj, jaki znak mam rysowac ";
  char znak;			
  cin >> znak;			// znak, na którego podstawie tworzymy szlaczek 
  cout << "Ile mam narysowac znakow:  " << znak << "? ";  
  int ile;			
  cin >> ile;			
  for (int p=0; p<ile; p++)
    cout << znak;		
  cout << endl;   
}
 
/*************** Początek funkcji głównej programu *************/
 
int main()
{
  cout << "Wywoluje funkcje szlaczek_10_gwiazdek()" << endl;
  szlaczek_10_gwiazdek();
  cout << endl << "Chce miec teraz szlaczek skladajacy sie";
  cout << "z pieciu wykrzyknikow" << endl;
  cout << "Wywoluje wiec funkcje szlaczek_dowolny(5,'!')" << endl;
  szlaczek_dowolny (5,'!');
  int k;
  char zn;
  cout << endl << "Zapytam, jaki chcesz miec szlaczek" << endl;
  cout << "Ile elementow ma miec szlaczek? (to jest zmienna k) ";
  cin >> k;
  cout << "Jakie to maja byc znaki? (to jest zmienna zn) ";
  cin >> zn;
  cout << endl << "Wywoluje funkcje szlaczek_dowolny(k,zn)" << endl;
  szlaczek_dowolny(k,zn);
  cout << endl << "Wywoluje funkcje szlaczek_inaczej()" << endl;
  szlaczek_inaczej ();
  cin.ignore();
  getchar();
  return 0;
}
/*************** Koniec funkcji głównej programu *************/

21.)Program rozwiązujący równanie liniowe z jedną niewiadomą:

#include <iostream>
#include <cstdio>
using namespace std;
 
void rozwiazanie(float a, float b)
{
  if (a!=0)  
    cout << "Rownanie ma dokladnie jedno rozwiazanie, rowne: " << b/a;
  else 
    if (b!=0) 
      cout << "Rownanie nie ma rozwiazan";
    else 
      cout << "Rownanie ma nieskonczenie wiele rozwiazan";
}
 
int main()
{
  float A, B;
  cout << "Podaj wspolczynniki rownania:" << endl;
  cin >> A >> B;
  rozwiazanie(A,B);
  cin.ignore();
  getchar();
  return 0;
}

22.)Program rozwiązujący układ równań liniowych z dwiema niewiadomymi:

#include <iostream>
#include <cstdio>
using namespace std;
 
void wyswietl_uklad(float a, float b, float c, float d, float e, float f)
{
  cout << "Rozwiazujemy uklad:" << endl;
  cout << a << " * x + " << b << " * y = " << c << endl;
  cout << d << " * x + " << e << " * y = " << f << endl;
}
float wyzn(float a, float b, float c, float d)
{
return a*d-b*c;
}
 
void rozwiazanie(float g, float x, float y)
{
if (g!=0)
{
  cout << "Uklad ma dokladnie jedno rozwiazanie ";
  cout << " x = " << x/g << " , y = " << y/g;
}
else 
  if ((x!=0)||(y!=0))
    cout << "Uklad nie ma rozwiazan";
  else 
      cout << "Uklad ma nieskonczenie wiele rozwiazan";
}
int main()
{
  float a1, a2, b1, b2, c1, c2;
  cout << "Podaj wspolczynniki do pierwszego rownania:" << endl;
  cin >> a1 >> b1 >> c1;
  cout << "Podaj wspolczynniki do drugiego rownania:" << endl;
  cin >> a2 >> b2 >> c2;
  wyswietl_uklad(a1,b1,c1,a2,b2,c2);
  rozwiazanie(wyzn(a1,b1,a2,b2), wyzn(c1,b1,c2,b2), wyzn(a1,c1,a2,c2)); // 1
  cin.ignore();
  getchar();
  return 0;
}

23.)Program znajdujący największą z trzech podanych liczb:

#include <iostream>
#include <cstdio>
using namespace std;
 
float maxi(float a, float b, float c)
{
  float max = a;
  if (b>max)  
    max = b;
  if (c>max)  
    max = c;
  return max;
}
 
int main()
{
  int x, y, z;
  cout << "Podaj trzy liczby, a znajde najwieksza ";
  cin >> x >> y >> z;
  cout << "Najwieksza z nich to: " << maxi(x,y,z);
  cin.ignore();
  getchar();
  return 0;
}

24.)Program porządkujący trzy liczby w kolejności od najmniejszej do największej:

#include <iostream>
#include <cstdio>
using namespace std;
 
void zamien_miejscami(int &x, int &y)
{
  int temp = x;
  x = y;
  y = temp;
}
 
int main()
{
  int a, b, c;
  cout << "Podaj wartosci a, b, c ";
  cin >> a >> b >> c;
  if (a > b) zamien_miejscami(a,b);	// tu dokonują się zamiany elementów
  if (a > c) zamien_miejscami(a,c);	// pomiędzy sobą, tak aby ostatecznie
  if (b > c) zamien_miejscami(b,c);	// zmienne a, b, c spelnialy warunek a<=b<=c
  cout << "Wartosci liczb a, b, c po zamianach: " << a << " " << b << " " << c;
  cin.ignore();  
  getchar();
  return 0;
}

25.)Program porządkujący trzy liczby w kolejności od najmniejszej do największej z wykorzystaniem funkcji:

#include <iostream>
#include <cstdio>
using namespace std;
 
void zamien_miejscami(int &x, int &y)
{
  int temp = x;
  x = y;
  y = temp;
}
 
void ustaw_rosnaco(int &a, int &b, int &c)
{
  if (a>b) zamien_miejscami(a,b);
  if (a>c) zamien_miejscami(a,c);
  if (b>c) zamien_miejscami(b,c);
}
 
int main()
{
  int a, b, c;
  cout << "Podaj wartosci a, b, c ";
  cin >> a >> b >> c;
  ustaw_rosnaco (a,b,c);
  cout << "Wartosci liczb a, b, c po zamianach: " << a << " " << b << " " << c;
  cin.ignore();  
  getchar();
  return 0;
}

Implementacja klasycznych algorytmów iteracyjnych
26.)Obliczanie NWD dwóch liczb podanych na wejściu metodą Euklidesa:

#include <iostream>
#include <cstdio>
using namespace std;
 
int NWD(int a, int b)	// funkcja licząca NWD(a,b)
{
  while (a!=b)		// dopóki a jest różne od b
  {
    if(a>b)      	// jeśli a jest większe od b to 
      a = a-b;		// w miejsce a podstaw różnicę a-b		
    else            	// w przeciwnym wypadku  
      b = b-a;		// w miejsce b podstaw różnicę b-a				
  }
  return a;
}
 
int main()		// funkcja główna programu
{
  int a, b;
  cout << "podaj pierwsza liczbe a: ";
  cin >> a;
  cout << "podaj druga liczbe b: ";
  cin >> b;
  cout << "NWD(" << a << "," << b << ") ma wartosc: " << NWD(a,b);
  cin.ignore();
  getchar();
  return 0;
}

27.)Obliczanie NWD dwóch liczb podanych na wejściu zoptymalizowaną metodą Euklidesa:

int NWD(int a, int b)
{
  while (a>0)
  {
    a = a%b;
    b = b-a;
  } 
  return b;
}

28.)Program obliczający pierwiastek kwadratowy liczby rzeczywistej metodą Newtona-Raphsona:

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
 
double pierwiastek(double x, double d)
{
  double a = x;
  while (fabs(a-(x/a))>d) // dopóki różnica boków jest większa od dokładności
  {
    a = (a+(x/a))/2;	// modyfikujemy dlugości boków, korzystając ze 
			// średniej arytmetycznej
  }
  return a;		// zwracamy dlugość boku jako wartość pierwiastka z x
}
 
int main()
{
  cout << "Pierwiastek wynosi: " << pierwiastek(2,0.01);
  getchar();
  return 0;
}

29.)Obliczanie przybliżonej wartości pola obszaru ograniczonego wykresem funkcji x^2 oraz osią OX w przedziale, .

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
 
double funkcja(double x)	//funkcja dla której liczymy calkę, tu x^2
{
  return x*x;
}
 
double pole_obszaru(int n, double a, double b)
{
  double P = 0;			//zmienna która sumuje pola prostokątów
  double d = (b-a)/n;		//dlugość przedziałów na jakie dzielimy <a;b>
  double x;			//punkty pośrednie przedzialów
  for (int k=0; k<n; k++)
  {
    x = a+(d*k)+(d/2);
    P = P+d*fabs(funkcja(x));	//suma pól prostokątów
  }
  return P;			//suma pól wszystkich prostokątów
}
 
int main()
{
  int ilosc;
  double a, b;
  cout << "Program oblicza pole obszaru ograniczonego";
  cout << "wykresem funkcji w przedziale <a; b>" << endl;
  cout << "podaj wartosc lewego kranca przedzialu:  a ";
  cin >> a;
  cout << "podaj wartosc prawego kranca przedzialu:  b ";
  cin >> b;
  cout << "Na ile przedzialow podzielic wyjsciowy przedzial?: ";
  cin >> ilosc;
  cout << "wartosc pola : " << pole_obszaru(ilosc,a,b);
  cin.ignore();
  getchar();
  return 0;
}

30.)Obliczanie przybliżenia miejsca zerowego funkcji w przedziale, metodą połowienia przedziałów:

#include <iostream>
#include <cstdio>
using namespace std;
 
double f(double x)
{
  return 2*x*x-4*x;
}
 
double m_zerowe(double a, double b, double dokladnosc)
{
  double d = (a+b)/2;
  while (b-a>dokladnosc && f(a)!=0 && f(b)!=0)
  {
    d = (a+b)/2;
    if (f(a)*f(d)<0)
      b = d; 
    else 
      a = d;
  }
  if (f(a)==0) return a;
  if (f(b)==0) return b;
  return d;
}
 
int main()
{
  double lewy, prawy, dokl;
  do
  {
    cout << "Podaj lewy kraniec przedzialu ";
    cin >> lewy;
    cout << "Podaj prawy kraniec przedzialu ";
    cin >> prawy;
  }
  while (f(lewy)*f(prawy)>0 || prawy<=lewy);
  cout << "Podaj dokladnosc ";
  cin >> dokl;
  cout << "Przyblizona wartosc miejsca zerowego: ";
  cout << m_zerowe(lewy,prawy,dokl) << endl;
  cin.ignore();
  getchar();
  return 0;
}

31.)Obliczanie przybliżonej wartości liczby π (liczba pi) Metodą Monte Carlo.

#include <iostream>
#include <cstdio>
#include <cstdlib> // używamy w programie funkcji rand()
using namespace std;
 
int main()
{
  double a, b; // zmienne pomocnicze - współrzedne losowanego punktu
  long T = 0; // dzięki typowi long możemy losowac wiele punktów
  long R;
  long ilosc;
  srand(time(NULL)); // inicjacja funkcji rand()
  cout << "Na podstawie ilu punktow znalezc wartosc liczby pi? ";
  cin >> ilosc;
  for(R=0; R<ilosc; R++)
  {
    a = (double)rand()/(RAND_MAX); // losujemy liczby rzeczywiste
    b = (double)rand()/(RAND_MAX); // z zakresu <0,1>
    if (a*a+b*b<=1) T++; // jeśli punkt należy do koła to zwiększamy licznik
  }
  cout << "liczba pi ma wartosc : " << (double)(4*T)/R;
  cin.ignore();
  getchar();
  return 0;
}

32.)Program Silnia wypisuje automatycznie silnie dla liczb od 1 do 25:

#include <iostream>
using namespace std;
int main ()
{
long long ile=1,n=1;
do
{
cout<<"\n silnia wynosi ="<<(n=n*ile); 
++ile;
}
while(ile<26); 
cout<<"\n Nacisnij ENTER aby zakonczyc \n";
getchar();
return 0;
}

W miare upływu czasu, dodam coś nowego.
Jeśli jakiś skrypt zawiera błąd, prosze o kontakt :DD