Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

obrazek

Autor artykułu: mgr Jerzy Wałaszek

©2026 mgr Jerzy Wałaszek

obrazek

Równania

Metoda Cramera

SPIS TREŚCI REMANENT
Podrozdziały
 

Definicje

W poprzednim rozdziale rozwiązaliśmy układ dwóch równań liniowych:

\[\begin{cases}
ax + by = c \\
dx + ey = f
\end{cases}\]

Wyprowadziliśmy wzór na zmienną \(x\):

\[x = \frac{ce - bf}{ae - bd}\]

Wyprowadźmy analogiczny wzór na zmienną \(y\):

\[
\begin{array}{l}
dx + ey = f, \quad x = \dfrac{f - ey}{d} \\[1.5ex]
a \dfrac{f - ey}{d} + by = c \\[1.5ex]
\dfrac{af - aey}{d} + by = c \\[1.5ex]
\dfrac{af}{d} + y \left( b - \dfrac{ae}{d} \right) = c \\[1.5ex]
y \left( b - \dfrac{ae}{d} \right) = c - \dfrac{af}{d} \\[1.5ex]
y \dfrac{bd - ae}{d} = \dfrac{cd - af}{d} \\[1.5ex]
y = \dfrac{cd - af}{d} \cdot \dfrac{d}{bd - ae} \\[1.5ex]
y = \dfrac{cd - af}{bd - ae} \\[1.5ex]
y = \dfrac{af - cd}{ae - bd}
\end{array}
\]

Ostatecznie:

\[
\begin{array}{l}
x = \dfrac{ce - bf}{ae - bd} \\[1.5ex]
y = \dfrac{af - cd}{ae - bd}
\end{array}
\]

Przyjrzyj się tym wzorom. W obu wzorach mianowniki ułamków są tym samym wyrażeniem. Różne są liczniki. Jeśli potraktujemy liczniki i mianowniki tych ułamków jako wyznaczniki macierzy drugiego stopnia, to:

\[
\begin{array}{l}
ae - bd = \det \begin{bmatrix} a & b \\ d & e \end{bmatrix} = \det A \\[2ex]
ce - bf = \det \begin{bmatrix} c & b \\ f & e \end{bmatrix} = \det A_x \\[2ex]
af - cd = \det \begin{bmatrix} a & c \\ d & f \end{bmatrix} = \det A_y
\end{array}
\]

Zapiszmy nasz układ równań w postaci macierzowej:

\[
\begin{array}{l}
A = \begin{bmatrix} a & b \\ d & e \end{bmatrix} \\[2ex]
X = \begin{bmatrix} x \\ y \end{bmatrix} \\[2ex]
B = \begin{bmatrix} c \\ f \end{bmatrix} \\[2ex]
A \times X = B \\[2ex]
\begin{bmatrix} a & b \\ d & e \end{bmatrix} \times \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} c \\ f \end{bmatrix}
\end{array}
\]

Macierz \(A\) jest macierzą współczynników stojących przy niewiadomych:

\[
\begin{array}{l}
\begin{cases}
{\color{red}a} x + {\color{red}b} y = c \\
{\color{red}d} x + {\color{red}e} y = f
\end{cases} \\[2ex]
A = \begin{bmatrix} {\color{red}a} & {\color{red}b} \\ {\color{red}d} & {\color{red}e} \end{bmatrix}
\end{array}
\]

Macierz \(A_x\) powstaje z macierzy \(A\), gdy kolumnę współczynników zmiennej \(x\) zastąpimy macierzą wyrazów wolnych \(B\):

\[
\begin{array}{l}
\begin{cases}
a x + b y = {\color{red}c} \\
d x + e y = {\color{red}f}
\end{cases} \\[2ex]
A_x = \begin{bmatrix} {\color{red}c} & b \\ {\color{red}f} & e \end{bmatrix}
\end{array}
\]

Macierz \(A_y\) powstaje z macierzy \(A\), gdy kolumnę współczynników zmiennej \(y\) zastąpimy macierzą wyrazów wolnych \(B\):

\[
\begin{array}{l}
\begin{cases}
a x + b y = {\color{red}c} \\
d x + e y = {\color{red}f}
\end{cases} \\[2ex]
A_y = \begin{bmatrix} a & {\color{red}c} \\ d & {\color{red}f} \end{bmatrix}
\end{array}
\]

Układ równań posiada rozwiązanie, jeśli wyznacznik macierzy \(A\) jest różny od 0. Wykorzystując wyznaczniki, możemy teraz zapisać:

\[
\begin{array}{l}
x = \dfrac{\det A_x}{\det A} \\[2ex]
y = \dfrac{\det A_y}{\det A}
\end{array}
\]

do podrozdziału  do strony 

Wzory Cramera

Wzory, które otrzymaliśmy w poprzednim podrozdziale, nie są przypadkowe. Matematyk szwajcarski Gabriel Cramer pokazał, iż za pomocą wyznaczników można rozwiązywać układy równań liniowych. Są to tak zwane wzory Cramera (ang. Cramer's rule).

Mamy układ \(n\) równań z \(n\) niewiadomymi:

\[
\begin{cases}
a_{1,1}x_1 + a_{1,2}x_2 + \dots + a_{1,n}x_n = b_1 \\
a_{2,1}x_1 + a_{2,2}x_2 + \dots + a_{2,n}x_n = b_2 \\
\dots \\
a_{n,1}x_1 + a_{n,2}x_2 + \dots + a_{n,n}x_n = b_n
\end{cases}
\]

Zapiszmy ten układ równań w postaci macierzowej:

\[
\begin{array}{l}
A_{n \times n} = \begin{bmatrix}
a_{1,1} & a_{1,2} & \dots & a_{1,n} \\
a_{2,1} & a_{2,2} & \dots & a_{2,n} \\
\dots & \dots & \dots & \dots \\
a_{n,1} & a_{n,2} & \dots & a_{n,n}
\end{bmatrix} \\[4ex]
X_n = \begin{bmatrix} x_1 \\ x_2 \\ \dots \\ x_n \end{bmatrix} \\[4ex]
B_n = \begin{bmatrix} b_1 \\ b_2 \\ \dots \\ b_n \end{bmatrix} \\[4ex]
A \times X = B \\[2ex]
\begin{bmatrix}
a_{1,1} & a_{1,2} & \dots & a_{1,n} \\
a_{2,1} & a_{2,2} & \dots & a_{2,n} \\
\dots & \dots & \dots & \dots \\
a_{n,1} & a_{n,2} & \dots & a_{n,n}
\end{bmatrix} \times
\begin{bmatrix} x_1 \\ x_2 \\ \dots \\ x_n \end{bmatrix} =
\begin{bmatrix} b_1 \\ b_2 \\ \dots \\ b_n \end{bmatrix}
\end{array}
\]

Macierz kwadratowa \(A\) stopnia n jest macierzą współczynników \(a\), które stoją przy niewiadomych \(x\).

Wektor \(X\) jest macierzą niewiadomych \(x\).

Wektor \(B\) jest macierzą współczynników wolnych \(b\).

Oznaczmy przez \(X_i\) macierz, która powstaje z macierzy \(A\) przez zastąpienie wyrazów w kolumnie i-tej wyrazami wektora \(B\):

\[
\begin{array}{l}
X_1 = \begin{bmatrix}
{\color{red}b_1} & a_{1,2} & \dots & a_{1,n} \\
{\color{red}b_2} & a_{2,2} & \dots & a_{2,n} \\
{\color{red}\dots} & \dots & \dots & \dots \\
{\color{red}b_n} & a_{n,2} & \dots & a_{n,n}
\end{bmatrix} \\[4ex]
X_2 = \begin{bmatrix}
a_{1,1} & {\color{red}b_1} & \dots & a_{1,n} \\
a_{2,1} & {\color{red}b_2} & \dots & a_{2,n} \\
\dots & {\color{red}\dots} & \dots & \dots \\
a_{n,1} & {\color{red}b_n} & \dots & a_{n,n}
\end{bmatrix} \\[4ex]
\dots \\[2ex]
X_n = \begin{bmatrix}
a_{1,1} & a_{1,2} & \dots & {\color{red}b_1} \\
a_{2,1} & a_{2,2} & \dots & {\color{red}b_2} \\
\dots & \dots & \dots & {\color{red}\dots} \\
a_{n,1} & a_{n,2} & \dots & {\color{red}b_n}
\end{bmatrix}
\end{array}
\]

Wartości zmiennych układu równań obliczamy ze wzorów Cramera:

\[
\begin{array}{l}
x_1 = \dfrac{\det X_1}{\det A} \\[2.5ex]
x_2 = \dfrac{\det X_2}{\det A} \\[2ex]
\dots \\[1ex]
x_n = \dfrac{\det X_n}{\det A}
\end{array}
\]

Układ posiada rozwiązanie, jeśli wyznacznik macierzy współczynników \(A\) jest różny od zera. Jeśli wyznacznik macierzy \(A\) jest równy zero, to układ równań jest albo sprzeczny (nie posiada rozwiązań) , albo nieoznaczony (posiada więcej niż jedno rozwiązanie).

Dla \(n\) niewiadomych \(x\) metoda Cramera wymaga policzenia \({n + 1}\) wyznaczników stopnia \(n\). Powoduje to, iż ma ona klasę złożoności obliczeniowej równą \(O(n^4)\), jeśli wyznaczniki są liczone za pomocą rozkładu LU. Istnieją lepsze metody rozwiązywania układów równań liniowych.

Przykład:

Rozwiązać układ równań:

\[
\begin{cases}
5x_1 - 2x_2 + 3x_3 = 21 \\
-2x_1 + 3x_2 + x_3 = -4 \\
-x_1 + 2x_2 + 3x_3 = 5
\end{cases}
\]

Układ zapisujemy macierzowo:

\[
\begin{array}{l}
\begin{cases}
5x_1 - 2x_2 + 3x_3 = 21 \\
-2x_1 + 3x_2 + x_3 = -4 \\
-x_1 + 2x_2 + 3x_3 = 5
\end{cases} \\[4ex]
A = \left[ \begin{array}{rrr} 5 & -2 & 3 \\ -2 & 3 & 1 \\ -1 & 2 & 3 \end{array} \right] \quad
X = \left[ \begin{array}{r} x_1 \\ x_2 \\ x_3 \end{array} \right] \quad
B = \left[ \begin{array}{r} 21 \\ -4 \\ 5 \end{array} \right] \\[4ex]
A \times X = B \\[2ex]
\left[ \begin{array}{rrr} 5 & -2 & 3 \\ -2 & 3 & 1 \\ -1 & 2 & 3 \end{array} \right] \times
\left[ \begin{array}{r} x_1 \\ x_2 \\ x_3 \end{array} \right] =
\left[ \begin{array}{r} 21 \\ -4 \\ 5 \end{array} \right]
\end{array}
\]

Obliczamy wyznacznik macierzy współczynników \(A\). Wykorzystujemy schemat Saurrusa:

\[
\begin{array}{l}
\det A = 5 \cdot 3 \cdot 3 + (-2) \cdot 1 \cdot (-1) + 3 \cdot (-2) \cdot 2 - 3 \cdot 3 \cdot (-1) - 5 \cdot 1 \cdot 2 - (-2) \cdot (-2) \cdot 3 \\[1.5ex]
\det A = 45 + 2 - 12 + 9 - 10 - 12 \\[1.5ex]
\det A = 22
\end{array}
\]

Obliczamy wyznacznik macierzy \(X_1\) (macierz A z zamienioną kolumną 1 na macierz B):

\[
\begin{array}{l}
X_1 = \left[ \begin{array}{rrr} 21 & -2 & 3 \\ -4 & 3 & 1 \\ 5 & 2 & 3 \end{array} \right] \\[4ex]
\det X_1 = 21 \cdot 3 \cdot 3 + (-2) \cdot 1 \cdot 5 + 3 \cdot (-4) \cdot 2 - 3 \cdot 3 \cdot 5 - 21 \cdot 1 \cdot 2 - (-2) \cdot (-4) \cdot 3 \\[1.5ex]
\det X_1 = 189 - 10 - 24 - 45 - 42 - 24 \\[1.5ex]
\det X_1 = 44
\end{array}
\]

Obliczamy wyznacznik macierzy \(X_2\) (macierz A z zamienioną kolumną 2 na macierz B):

\[
\begin{array}{l}
X_2 = \left[ \begin{array}{rrr} 5 & 21 & 3 \\ -2 & -4 & 1 \\ -1 & 5 & 3 \end{array} \right] \\[4ex]
\det X_2 = 5 \cdot (-4) \cdot 3 + 21 \cdot 1 \cdot (-1) + 3 \cdot (-2) \cdot 5 - 3 \cdot (-4) \cdot (-1) - 5 \cdot 1 \cdot 5 - 21 \cdot (-2) \cdot 3 \\[1.5ex]
\det X_2 = -60 - 21 - 30 - 12 - 25 + 126 \\[1.5ex]
\det X_2 = -22
\end{array}
\]

Obliczamy wyznacznik macierzy \(X_3\):

\[
\begin{array}{l}
X_3 = \left[ \begin{array}{rrr} 5 & -2 & 21 \\ -2 & 3 & -4 \\ -1 & 2 & 5 \end{array} \right] \\[4ex]
\det X_3 = 5 \cdot 3 \cdot 5 + (-2) \cdot (-4) \cdot (-1) + 21 \cdot (-2) \cdot 2 - 21 \cdot 3 \cdot (-1) - 5 \cdot (-4) \cdot 2 - (-2) \cdot (-2) \cdot 5 \\[1.5ex]
\det X_3 = 75 - 8 - 84 + 63 + 40 - 20 \\[1.5ex]
\det X_3 = 66
\end{array}
\]

Obliczamy niewiadome:

\[
\begin{array}{l}
x_1 = \dfrac{\det X_1}{\det A} = \dfrac{44}{22} = 2 \\[2.5ex]
x_2 = \dfrac{\det X_2}{\det A} = \dfrac{-22}{22} = -1 \\[2.5ex]
x_3 = \dfrac{\det X_3}{\det A} = \dfrac{66}{22} = 3
\end{array}
\]

Sprawdzamy, czy wyliczone wartości niewiadomych spełniają równania:

\[
\begin{array}{l}
\begin{cases}
5x_1 - 2x_2 + 3x_3 = 21 \\
-2x_1 + 3x_2 + x_3 = -4 \\
-x_1 + 2x_2 + 3x_3 = 5
\end{cases} \\[4ex]
5 \cdot 2 - 2 \cdot (-1) + 3 \cdot 3 = 10 + 2 + 9 = 21 \quad {\color{green}\text{dobrze}} \\[1.5ex]
-2 \cdot 2 + 3 \cdot (-1) + 3 = -4 - 3 + 3 = -4 \quad {\color{green}\text{dobrze}} \\[1.5ex]
-2 + 2 \cdot (-1) + 3 \cdot 3 = -2 - 2 + 9 = 5 \quad {\color{green}\text{dobrze}}
\end{array}
\]

Poniższy program rozwiązuje za pomocą wzorów Cramera układ równań liniowych. Program zawiera funkcję obliczającą wyznacznik macierzy, która wykorzystuje rozkład LU z piwotowaniem. Dane wejściowe do programu wyglądają następująco:

Pierwsza liczba \(n\) określa ilość równań w układzie. Następne \(n\) wierszy po \(n\) liczb definiują współczynniki a przy niewiadomych. Ostatni wiersz zawiera \(n\) liczb definiujących wyrazy wolne \(b\).

Układ równań:

\[
\begin{cases}
-x_1 + 2x_2 - 3x_3 + 3x_4 + 5x_5 = 56 \\
8x_1 + 7x_3 + 4x_4 - x_5 = 62 \\
-3x_1 + 4x_2 - 3x_3 + 2x_4 - 2x_5 = -10 \\
8x_1 - 3x_2 - 2x_3 + x_4 + 2x_5 = 14 \\
-2x_1 - x_2 - 6x_3 + 9x_4 = 28
\end{cases}
\]
Dane wejściowe:

5
-1 2 -3 3 5
8 0 7 4 -1
-3 4 -3 2 -2
8 -3 -2 1 2
-2 -1 -6 9 0
56 62 -10 14 28
C++
// Wzory Cramera
// (C)2019 mgr Jerzy Wałaszek
// Metody numeryczne 0066
//---------------------------

#include <iostream>
#include <windows.h>
#include <iomanip>
#include <cmath>

using namespace std;

const double EPS = 0.000000001;

// Funkcja oblicza wartość
// wyznacznika macierzy
// metodą rozkładu LU
// z piwotowaniem
// n - stopień macierzy
// A - wskaźnik macierzy
//----------------------
double det(int n, double ** A)
{
  int i, j, k, * W, md, maxw;
  double sc, akk, maxe;

  // Mnożnik korekcyjny
  //  dla wyznacznika
  md = 1;

  // Tworzymy wektor wierszowy
  W = new int [n];

  // Inicjujemy wektor wierszowy
  // numerami wierszy
  for(i = 0; i < n; i++)
    W[i] = i;

  // Rozkład LU
  for(k = 0; k < n; k++)
  {
    // numer wiersza
    // z elementem max
    maxw = k;
    maxe = fabs(A[W[k]][k]);

    // Szukamy elementu max
    for(i = k + 1; i < n; i++)
      if(fabs(A[W[i]][k]) > maxe)
      {
        maxw = i;
        maxe = fabs(A[W[i]][k]);
      }

    // Jeśli max jest zero,
    // to macierz jest
    // zdegenerowana
    if(maxe <= EPS)
      return 0;

    // Jeśli max nie leży
    // na przekątnej,
    // zamieniamy wiersze
    if(maxw != k)
    {
      // Modyfikujemy mnożnik
      md = -md;
      swap(W[k], W[maxw]);
    }

    // Dzielnik
    akk = A[W[k]][k];

    // Normalizujemy kolumnę
    for(i = k + 1; i < n; i++)
      A[W[i]][k] /= akk;

    // Modyfikujemy podmacierz
    for(i = k + 1; i < n; i++)
      for(j = k + 1; j < n; j++)
        A[W[i]][j] -= A[W[i]][k]
                    * A[W[k]][j];
  }

  // Obliczamy wyznacznik;
  sc = md;
  for(k = 0; k < n; k++)
    sc *= A[W[k]][k];
  delete [] W;
  return sc;
}

// Program główny
//---------------

int main()
{
  SetConsoleOutputCP(CP_UTF8);
  SetConsoleCP(CP_UTF8);

  cout << setprecision(5)
       << fixed;

  cout
  << "Rozwiązywanie układu "
     "równań liniowych "
     "wzorami Cramera\n"
     "---------------------"
     "-----------------"
     "---------------\n\n"
     "Wpisz dane "
     "wejściowe:\n\n";

  // Indeksy
  int i,j,k;
  // Liczba równań w układzie
  int n;

  cin >> n;

  // Tworzymy dynamicznie
  // potrzebne macierze

  // Macierz współczynników
  // przy niewiadomych x
  double ** A;
  // Macierz pomocnicza
  double ** Xi;

  A  = new double * [n];
  Xi = new double * [n];

  for(i = 0; i < n; i++)
  {
    A[i] = new double[n];
    Xi[i] = new double[n];
  }

  // Odczytujemy współczynniki
  for(i = 0; i < n; i++)
    for(j = 0; j < n; j++)
    {
      cin >> A[i][j];
      Xi[i][j] = A[i][j];
     }

  // Macierz wyrazów wolnych
  double * B;

  B = new double[n];

  // Odczytujemy wyrazy wolne
  for(i = 0; i < n; i++)
    cin >> B[i];

  cout << endl;

  // Rozpoczynamy od obliczenia
  // wyznacznika macierzy A
  double detA = det(n,Xi);

  if(fabs(detA)< EPS)
    cout <<
    "Układ równań nie "
    "ma rozwiązania\n";
  else
  {
    // Tworzymy macierz rozwiąń
    double * X = new double[n];

    // Rozpoczynamy wyliczanie
    // niewiadomych
    for(k = 0; k < n; k++)
    {
      // Ustawiamy macierz
      // pomocniczą Xi
      for(i = 0; i < n; i++)
        for(j = 0; j < n; j++)
          if(j == k)
            Xi[i][j] = B[i];
          else
            Xi[i][j] = A[i][j];

      // Obliczamy niewiadomą:
      X[k] = det(n,Xi) / detA;
    }

    // Wyświetlamy wyniki:
    for(i = 0; i < n; i++)
      cout << "x" << i << " = "
           << setw(12)
           << X[i] << endl;

    // Usuwamy tablicę
    // dynamiczną:
    delete [] X;
  }

  cout << endl;

  for(i = 0; i < n; i++)
  {
    delete [] A[i];
    delete [] Xi[i];
  }
  delete [] A;
  delete [] Xi;
  delete [] B;

  system("pause");
  return 0;
}
Wynik
Rozwiązywanie układu równań liniowych wzorami Cramera
-----------------------------------------------------

Wpisz dane wejściowe:

5
-1 2 -3 3 5
8 0 7 4 -1
-3 4 -3 2 -2
8 -3 -2 1 2
-2 -1 -6 9 0
56 62 -10 14 28

x0 =    1.00000
x1 =    3.00000
x2 =    5.00000
x3 =    7.00000
x4 =    9.00000
Python (dodatek)
# Wzory Cramera
# (C)2026 mgr Jerzy Wałaszek
# Metody numeryczne 0066
#---------------------------

EPS = 0.000000001

# Funkcja oblicza wartość
# wyznacznika macierzy
# metodą rozkładu LU
# z piwotowaniem
# n - stopień macierzy
# A - wskaźnik macierzy
#----------------------
def det(n,a):
    # Mnożnik korekcyjny
    # dla wyznacznika
    md = 1

    # Tworzymy wektor wierszowy
    w = [i for i in range(n)]

    # Rozkład LU
    for k in range(n):
        # numer wiersza
        # z elementem max
        maxw = k
        maxe = abs(a[w[k]][k])

        # Szukamy elementu max
        for i in range(k + 1, n):
            if abs(a[w[i]][k]) > maxe:
                maxw = i
                maxe = abs(a[w[i]][k])

        # Jeśli max jest zero,
        # to macierz jest
        # zdegenerowana
        if(maxe <= EPS):
            return 0

        # Jeśli max nie leży
        # na przekątnej,
        # zamieniamy wiersze
        if maxw != k:
            # Modyfikujemy mnożnik
            md = -md
            w[k], w[maxw] = w[maxw], w[k]

        # Dzielnik
        akk = a[w[k]][k]

        # Normalizujemy kolumnę
        for i in range(k + 1, n):
            a[w[i]][k] /= akk

        # Modyfikujemy podmacierz
        for i in range(k + 1, n):
            for j in range(k + 1, n):
                a[w[i]][j] -= (a[w[i]][k]
                             * a[w[k]][j])

    # Obliczamy wyznacznik
    sc = md
    for k in range(n):
        sc *= a[w[k]][k]
    
    return sc

# Program główny
#---------------

print("Rozwiązywanie układu "
      "równań liniowych "
      "wzorami Cramera\n"
      "---------------------"
      "-----------------"
      "---------------\n\n"
      "Wpisz dane wejściowe:\n")

n = int(input())

# Tworzymy dynamicznie
# potrzebne macierze

# Odczytujemy współczynniki
# tworząc z nich macierze
a = [[float(s) for s in input().split()]
               for _ in range(n)]
xi = [s[:] for s in a]

# Odczytujemy wyrazy wolne
b = [float(s) for s in input().split()]

print()

# Rozpoczynamy od obliczenia
# wyznacznika macierzy A
det_a = det(n,xi)

if abs(det_a) < EPS:
    print("Układ równań bez rozwiązania")
else:
    # Tworzymy macierz rozwiąń
    x = [0.0 for _ in range(n)]

    # Rozpoczynamy wyliczanie
    # niewiadomych
    for k in range(n):
        # Ustawiamy macierz
        # pomocniczą Xi
        for i in range(n):
            for j in range(n):
                if j == k:
                    xi[i][j] = b[i]
                else:
                    xi[i][j] = a[i][j];

        # Obliczamy niewiadomą:
        x[k] = det(n,xi) / det_a

    # Wyświetlamy wyniki:
    for i in range(n):
        print(f"x{i} = {x[i]:12.5f}")

print()
input("Naciśnij Enter...")

do podrozdziału  do strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2026 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.