Swap

Implementirati funkciju swap na tri različita načina:

  1. void razmeni_ref(int& x, int& y) - razmena dva cela broja preko referenci.
  2. void razmeni_pok(int* x, int* y) — razmena dva cela broja preko pokazivača.
  3. void razmeni_pokazivace_ref(int*& p, int*& q) — razmena pokazivača preko reference.
  4. void razmeni_pokazivace_pok(int **p, int** q) - razmena pokazivača preko pokazivača na pokazivače.

Ulaz

Sa standardnog ulaza učitavaju se dva cela broja a b.

Izlaz

U prvom redu ispisati vrednosti pormenljivih a i b nakon poziva razmeni_ref(a, b).

U drugom redu ispisati vrednosti promenljivih a i b nakon poziva razmeni_pok(&a, &b).

U trećem redu ispisati vrednosti na koje pokazuju pokazivači p i q promenljivih a i b nakon poziva razmeni_pokazivace_ref(p, q).

U četvrtom redu ispisati vrednosti na koje pokazuju pokazivači p i q promenljivih a i b nakon poziva razmeni_pokazivace_pok(%p, &q).

Primer

Ulaz

5 1

Izlaz

1 5
5 1
1 5
5 1

Postavka

main.cpp

#include <iostream>

namespace matf
{
  // TODO (1): implementirati razmeni_ref - razmena dva cela broja preko referenci
  void razmeni_ref(int& x, int& y)
  {
    return undefined;
  }

  // TODO (2): implementirati razmeni_pok - razmena dva cela broja preko pokazivaca
  void razmeni_pok(int* x, int* y)
  {
    return undefined;
  }

  // TODO (3): implementirati razmeni_pokazivace_ref - razmenjuje pokazivace 
  // p i q (ne objekte na koje pokazuju), preko referenci na pokazivace
  void razmeni_pokazivace_ref(int*& p, int*& q)
  {
    return undefined;
  }

  // TODO (4): implementirati razmeni_pokazivace_pok - razmenjuje pokazivace
  // na koje pokazuju p i q, preko pokazivaca na pokazivace
  void razmeni_pokazivace_pok(int** p, int** q)
  {
    return undefined;
  }

} // namespace matf

int main()
{
  int a, b;
  std::cin >> a >> b;

  matf::razmeni_ref(a, b);
  std::cout << a << ' ' << b << std::endl;

  matf::razmeni_pok(&a, &b);
  std::cout << a << ' ' << b << std::endl;

  int* p = &a;
  int* q = &b;

  matf::razmeni_pokazivace_ref(p, q);
  std::cout << *p << ' ' << *q << std::endl;

  matf::razmeni_pokazivace_pok(&p, &q);
  std::cout << *p << ' ' << *q << std::endl;

  return 0;
}

Rešenje

main.cpp

#include <iostream>

namespace matf
{
  // O(1); razmenjuje vrednosti x i y preko referenci
  void razmeni_ref(int& x, int& y)
  {
    int tmp = x;
    x = y;
    y = tmp;
  }

  // O(1); razmenjuje vrednosti na koje pokazuju x i y
  void razmeni_pok(int* x, int* y)
  {
    int tmp = *x;
    *x = *y;
    *y = tmp;
  }

  // O(1); razmenjuje POKAZIVACE p i q (ne objekte na koje pokazuju), preko
  // referenci na pokazivace.
  void razmeni_pokazivace_ref(int*& p, int*& q)
  {
    int* tmp = p;
    p = q;
    q = tmp;
  }

  // O(1); razmenjuje POKAZIVACE na koje pokazuju p i q (ne objekte na koje
  // ti pokazivaci dalje pokazuju), preko pokazivaca na pokazivace.
  void razmeni_pokazivace_pok(int** p, int** q)
  {
    int* tmp = *p;
    *p = *q;
    *q = tmp;
  }

} // namespace matf

int main()
{
  int a, b;
  std::cin >> a >> b;

  matf::razmeni_ref(a, b);
  std::cout << a << ' ' << b << std::endl;

  matf::razmeni_pok(&a, &b);
  std::cout << a << ' ' << b << std::endl;

  int* p = &a;
  int* q = &b;

  matf::razmeni_pokazivace_ref(p, q);
  std::cout << *p << ' ' << *q << std::endl;

  matf::razmeni_pokazivace_pok(&p, &q);
  std::cout << *p << ' ' << *q << std::endl;

  return 0;
}