Písemka - maturanti

Napište třídu Zlomek obsahující:

Po přičtení se zlomek musí automaticky zkrátit.

Ukázkové řešení - Ruby

class Zlomek
    attr_reader :citatel, :jmenovatel
    
    def initialize(citatel, jmenovatel)
        @citatel = citatel
        @jmenovatel = jmenovatel
    end
    
    def +(scitanec) # mírná odchylka od zadání, jen pro zajímavost
        citatel = @citatel*scitanec.jmenovatel + scitanec.citatel*@jmenovatel
        jmenovatel = @jmenovatel*scitanec.jmenovatel
        
        a, b = citatel, jmenovatel
        a, b = b, a if a > b
        while a > 0
            a, b = b%a, a
        end
        return Zlomek.new(citatel/b, jmenovatel/b)
    end
    def to_s
        return "Zlomek "+@citatel.to_s+"/"+@jmenovatel.to_s
    end
end

A = Zlomek.new(3, 12)
B = Zlomek.new(3, 15)
A += B
puts A.to_s

Ukázkové řešení - C++

#include <iostream>
using namespace std;

class Zlomek {
protected:
  int citatel, jmenovatel;
  int nejvetsi_spolecny_delitel() {
    int mensi_cislo = 0;
    if (a > b)
      mensi_cislo = 1;
    int pole[] = {a, b}; // jen malý trik, abychom nemuseli proměnné po každém výpočtu přehazovat mezi sebou
    while (pole[mensi_cislo] > 0) {
      pole[1-mensi_cislo] %= pole[mensi_cislo];
      mensi_cislo = 1 - mensi_cislo;
    }
    return pole[1-mensi_cislo]; // pole[1-mensi_cislo] je vždycky větší číslo
  }

public:
  Zlomek(int zadany_citatel, int zadany_jmenovatel) {
    citatel = zadany_citatel;
    jmenovatel = zadany_jmenovatel;
  }
  void pricti(Zlomek scitanec) {
    citatel = citatel*scitanec.jmenovatel + scitanec.citatel*jmenovatel;
    jmenovatel *= scitanec.jmenovatel;
    int delitel = nejvetsi_spolecny_delitel();
    citatel /= delitel;
    jmenovatel /= delitel;
    cout << "Výsledek je " << citatel << "/" << jmenovatel << endl;
  }
};

int main() {
  Zlomek A = Zlomek(3, 12);
  Zlomek B = Zlomek(3, 15);
  A.pricti(B);
  
  return 0;
}

Ukázkové řešení - Java

package net.gymjs.pvt;

public class Zlomek {
    protected int citatel, jmenovatel;
    public Zlomek(int zadany_citatel, int zadany_jmenovatel) {
        citatel = zadany_citatel;
        jmenovatel = zadany_jmenovatel;
    }

    public void pricti(Zlomek scitanec) {
        citatel = citatel*scitanec.jmenovatel + scitanec.citatel*jmenovatel;
        jmenovatel *= scitanec.jmenovatel;
        int a = Math.min(citatel, jmenovatel), b = Math.max(citatel, jmenovatel);
        while (a > 0) {
            int c = b%a;
            b = a;
            a = c;
        }
        citatel /= b;
        jmenovatel /= b;
    }
    
    @Override public String toString() {
        return "Zlomek "+citatel+"/"+jmenovatel+"\n";
    }

    public static void main(String args[]) {
        Zlomek A = new Zlomek(3, 15);
        Zlomek B = new Zlomek(3, 12);
        A.pricti(B);
        System.out.println(A);
    }
}