Aşağıda ismi Fraction
olan bir sınıfın tanımlandığı başlık dosyası yer almaktadır.
Bu ödevde Fraction
sınıfının kodlarını yazmanız isteniyor.
Fraction
sınıfı türünden bir nesnenin değeri bir rasyonel sayı (kesirdir) . Örnek:(3/5)
Fraction
sınıfı türünden bir nesne rasyonel sayıyı en sade haliyle tutar. Örneğin bir rasyonel sayının değeri(12/36)
olamaz. Değer(1/3)
olarak tutulmalıdır.- Rasyonel sayı negatif ya da pozitif olabilir.
(4/7) (-2/5) (-12)
- Pay
(numerator)
ve payda(denominator)
isteyen kurucu işlev. - Kurucu işlev. Oluşturulacak rasyonel sayının değeri argüman olarak alınan
double
değere yakın olmalı. - Kurucu işlev. Oluşturulacak rasyonel sayının değeri argüman olarak gelen
std::string
nesnesinden alınacak. - Toplama işlemli atama operatör fonksiyonu. (üye operatör fonksiyonu olmalı)
- Çıkartma işlemli atama operatör fonksiyonu. (üye operatör fonksiyonu olmalı)
- Çarpma işlemli atama operatör fonksiyonu. (üye operatör fonksiyonu olmalı)
- Bölme işlemli atama operatör fonksiyonu. (üye operatör fonksiyonu olmalı)
- Önek
++
operatörünü yükleyen işlev. (İşlevin referans döndürdüğüne dikkat ediniz). - Sonek
++
operatörünü yükleyen işlev. (İşlevin referans döndürmediğine dikkat ediniz). - Önek
--
operatörünü yükleyen işlev. (İşlevin referans döndürdüğüne dikkat ediniz). - Sonek
--
operatörünü yükleyen işlev. (İşlevin referans döndürmediğine dikkat ediniz). - pay
(numerator)
değerini döndürenconst
üye işlev. - payda
(denominator)
değerini döndürenconst
üye işlev. bool
türüne dönüştürenexplicit
operatör fonksiyonu. (Dilersenizconstexpr
yapabilirsiniz.)operator !
üye fonksiyonu. (Dilersenizconstexpr
yapabilirsiniz.)double
türüne dönüştüren isimlendirilmiş tür dönüştürme operatör fonksiyonu.std::string
türüne dönüştüren tür dönüştürme operatör fonksiyonu.- Rastgele
Fraction
döndürenstatic
üye fonksiyon. - İki rasyonel sayıyı toplayan operatör fonksiyonu. Dilerseniz üye fonksiyon olarak yazabilirsiniz.
- İki rasyonel sayıyı birbirinden çıkartan operatör fonksiyonu. Dilerseniz üye fonksiyon olarak yazabilirsiniz.
- İki rasyonel sayıyı çarpan operatör fonksiyonu. Dilerseniz üye fonksiyon olarak yazabilirsiniz.
- İki rasyonel sayıyı birbirine bölen operatör fonksiyonu. Dilerseniz üye fonksiyon olarak yazabilirsiniz.
- == Karşılaştırma operatörü. Dilerseniz üye fonksiyon olarak yazabilirsiniz.
- != Karşılaştırma operatörü. Dilerseniz üye fonksiyon olarak yazabilirsiniz.
<
Karşılaştırma operatörü. Dilerseniz üye fonksiyon olarak yazabilirsiniz.<=
Karşılaştırma operatörü. Dilerseniz üye fonksiyon olarak yazabilirsiniz.>
Karşılaştırma operatörü. Dilerseniz üye fonksiyon olarak yazabilirsiniz.>=
Karşılaştırma operatörü. Dilerseniz üye fonksiyon olarak yazabilirsiniz.Fraction
nesnelerinin değerlerini çıkış akımlarına yazdıracak global operatör işlevi(inserter)
- Pay ve payda arasında
'/'
karakteri olacak - Payda
1
ise yazılmayacak.(5) (-13)
- Eğer kesir negatif ise
-
işareti yalnızca payda olacak.(-5/3) (-3/5)
Fraction
nesnelerine giriş akımlarından aldığı karakterlerden oluşturulacak değeri yerleştiren global operatör işlevi(extractor)
Giriş formatı:(12/5)
. (Boşluk karakterleri dikkate alınmayacak)- Ham
(uncooked)
user defined literal operatör fonksiyonu"3/5"_f
- Dilediğiniz global işlevleri
"friend"
yapabilirsiniz. - Sınıfın
private
arayüzünü dilediğiniz gibi oluşturabilirsiniz. - Gerekli görürseniz sınıfın
public
arayüzüne eklemeler yapabilirsiniz. - Gerekli görürseniz sınıfın
public
arayüzünde değişiklikler yapabilirsiniz. - Sınıfın
public
öğelerinin isimlerini istediğiniz şekilde değiştirebilirsiniz. - Dilediğiniz işlevleri
"constexpr"
yapabilirsiniz. - Dilediğiniz işlevleri
"constexpr"
olmaktan çıkartabilirsiniz. - Bu ödevde
"exception handling"
araçlarını kullanmayacağız. (exception handling
konusunu gördükten sonra kodlarda değişiklik yapacağız.) - Kod tekrarından mümkün olduğu kadar kaçınmalısınız.
const
doğruluğuna(const correctness)
çok dikkat etmelisiniz.(const olması gereken tüm varlıklar const olmalı)
- Gereksiz yorum satırlarından mümkün olduğu kadar kaçınmalısınız.
- Yazdığınız kodların doğru çalışıp çalışmadığını sınamak için test kodları yazmalısınız.
- Derleyicinizin uygun bir
switch
'ini kullanarak mantıksal uyarı iletilerinin hata(error)
olarak değerlendirilmesini sağlayınız.
#include <string>
#include <iosfwd>
class Fraction {
public:
constexpr explicit Fraction(int num = 0, int denum = 1); //1
constexpr explicit Fraction(double dval); // 2
explicit Fraction(const std::string &s); //3
Fraction& operator+=(const Fraction& f); //4
Fraction& operator-=(const Fraction& f); //5
Fraction& operator*=(const Fraction& f); //6
Fraction& operator/=(const Fraction& f); //7
Fraction& operator++(); //8
Fraction operator++(int); //9
Fraction& operator--(); //10
Fraction operator--(int); //11
constexpr int Num()const; //12
constexpr int Denom()const; //13
explicit operator bool()const; //14
bool operator !()const; //14
double to_double()const; //15
std::string to_string()const; //16
static Fraction Random(); //17
};
constexpr Fraction operator+(const Fraction& f1, const Fraction &f2); //18
constexpr Fraction operator-(const Fraction& f1, const Fraction &f2); //19
constexpr Fraction operator*(const Fraction& f1, const Fraction &f2); //20
constexpr Fraction operator/(const Fraction& f1, const Fraction &f2); //21
bool operator==(const Fraction& f1, const Fraction& f2); //22
bool operator!=(const Fraction& f1, const Fraction& f2); //23
bool operator<(const Fraction& f1, const Fraction& f2); //24
bool operator<=(const Fraction& f1, const Fraction& f2); //25
bool operator>(const Fraction& f1, const Fraction& f2); //26
bool operator>=(const Fraction& f1, const Fraction& f2); //27
std::ostream &operator<<(std::ostream&, const Fraction &); //28
std::istream &operator>>(std::istream&, Fraction &); //29
constexpr Fraction operator""_f(const char*, size_t); //30