9. přednáška

Třída zlomek má dvě privátní složky - citatel a jmenovatel a dále privátní metodu zkrat, kterou budou používat všechny metody po výpočtu. Dále má implicitní, parametrický a kopírovací konstruktor a destruktor. Medtodz umožňují k aktuální instanci přičíst, odečíst či přinásobit jiný zlomek a změnit znaménko. Gettery vrací hodnotu čítatele a jmenovatale. Dále obsahuje metody pro výpis a test na stejnou hodnotu. Spřátelená funkce nsd nalezne největšího společného dělitele čitatele a jmenovatele.

#include<iostream>
 
using namespace std;
 
class zlomek
{
private:
  int jmenovatel, citatel;
  void zkrat();
public:
  zlomek(){};
  zlomek(int c, int j=1):citatel(c),jmenovatel(j){}
  zlomek(zlomek const &z){jmenovatel=z.jmenovatel;citatel=z.citatel;}
  void minus();
  void pricti(zlomek z);
  void odecti(zlomek z);
  void vynasob(zlomek z);
  int getcitatel(){return citatel;}
  int getjmenovatel(){return jmenovatel;}
  void vypis();
  bool je_stejny(zlomek z);
  friend int nsd(zlomek z);
};
 
void swap(int &a, int &b)
{
  int c;
  c=a;
  a=b;
  b=c;
}
 
int nsd(int a, int b)
{
  if (a>b) swap(a, b);
  int c;
  do
  {
    c = a%b;
    a=b;
    b=c;
  }
  while(c);
  return a;
}
 
int nsn(int a, int b)
{
  return a*b/nsd(a,b);
}
 
void zlomek::pricti(zlomek z)
{
  citatel = citatel*z.jmenovatel+jmenovatel*z.citatel;
  jmenovatel = jmenovatel*z.jmenovatel;
  zkrat();
}
 
void zlomek::odecti(zlomek z)
{
  citatel = citatel*z.jmenovatel-jmenovatel*z.citatel;
  jmenovatel = jmenovatel*z.jmenovatel;
  zkrat();
}
 
void zlomek::vynasob(zlomek z)
{
  citatel = citatel*z.citatel;
  jmenovatel = jmenovatel*z.jmenovatel;
  zkrat();
}
 
int nsd(zlomek z)
{
  return nsd(z.citatel, z.jmenovatel);
}
 
void zlomek::zkrat()
{
  int delitel = nsd(*this);
  jmenovatel /= delitel;
  citatel /= delitel;
}
 
void zlomek::vypis()
{
  cout << citatel << "/" << jmenovatel << endl;
}
 
void zlomek::minus()
{
  citatel = -citatel;
}
 
bool zlomek::je_stejny(zlomek z)
{
  return (citatel*z.jmenovatel==jmenovatel*z.citatel);
}
 
int main(void)
{
  zlomek a(2,5), b(3,4), c(2, 3), d(4, 6);
  a.pricti(b);
  a.vypis();
  a.minus();
  a.vypis();
  if (d.je_stejny(c)) cout << "ano" << endl;
  else cout << "ne" << endl;
  return 0;
}