namespace _04_Constructors
{
/// <summary>
/// Öğrenci adı ve soyadı verilerini tutan, 1. vize, 2. vize ve final notları üzerinden not ortalamasını ve geçme / kalma durumunu hesaplayan sınıf.
/// </summary>
class Ogrenci
{
// constant (sabit) fields
const decimal VIZE1CARPAN = 0.2m; // decimal tipteki değişkenlere değer atanırken değer sonuna m veya M yazılmalıdır
const decimal VIZE2CARPAN = 0.2M;
const decimal FINALCARPAN = 0.6m;
// fields
decimal _vize1;
decimal _vize2;
decimal _final;
decimal _ortalama = -1; // *1, alanlara ilk değer ataması burada yapılabileceği gibi constructor'larda da yapılabilir (özellikler için de geçerli),
// ortalamanın hesaplanmadığını belirtmek için -1 atadık, aşağıdaki OrtalamaVeDurumHesapla methodu çağrıldığında ortalama hesaplanmış olacak
//string _durum = "Kaldı"; // *2, alanlara ilk değer ataması burada yapılabileceği gibi constructor'larda da yapılabilir (özellikler için de geçerli)
string _durum; // *2
// properties
public string Adi { get; set; }
public string Soyadi { get; set; }
// constructors
// 1. parametreli constructor, tıpkı methodlarda olduğu gibi parametreler üzerinden alan ve özellik atama işlemleri yapılabilir
public Ogrenci(string adi, string soyadi, decimal vize1, decimal vize2, decimal final)
{
// özelliklerin parametreler üzerinden atanması
Adi = adi;
Soyadi = soyadi;
// alanların parametreler üzerinden atanması
_vize1 = vize1;
_vize2 = vize2;
_final = final;
// alan ilk değerlerinin atanması (özellikler için de geçerli)
// *1
//_ortalama = -1;
// *2
_durum = "Kaldı";
}
// 2. parametreli constructor, constructor overload, tıpkı methodlarda olduğu gibi constructor'lar da imzaları üzerinden overload edilebilir
public Ogrenci(decimal vize1, decimal vize2, decimal final)
{
// alanların parametreler üzerinden atanması
_vize1 = vize1;
_vize2 = vize2;
_final = final;
// alan ilk değerlerinin atanması (özellikler için de geçerli)
// *1
//_ortalama = -1;
// *2
_durum = "Kaldı";
}
// 3. parametreli constructor, constructor overload, tıpkı methodlarda olduğu gibi constructor'lar da imzaları üzerinden overload edilebilir,
// istenirse en sondan başlanarak default parametreler de kullanılabilir
public Ogrenci(string adi, string soyadi, string durum = "Devamsız")
{
// özelliklerin parametreler üzerinden atanması
Adi = adi;
Soyadi = soyadi;
// alanların parametreler üzerinden atanması
_durum = durum;
}
// 4. parametresiz (default) constructor, eğer bu constructor kullanılarak obje new'leme işlemi yapılmayacaksa yazmak zorunlu değildir
public Ogrenci()
{
// alan ilk değerlerinin atanması (özellikler için de geçerli)
// *1
//_ortalama = -1;
// *2
_durum = "Kaldı";
}
// behaviors
public void OrtalamaVeDurumHesapla()
{
_ortalama = _vize1 * VIZE1CARPAN + _vize2 * VIZE2CARPAN + _final * FINALCARPAN;
if (_ortalama >= 60)
_durum = "Geçti";
}
public string Getir()
{
string sonuc = $"Öğrenci: {Adi} {Soyadi}";
if (_ortalama != -1) // eğer ortalama -1 ise OrtalamaVeDurumHesapla methodu çağrılmamış demektir, bu yüzden ortalamayı yazdırmıyoruz
sonuc += $"\nNot Ortalaması: {_ortalama.ToString("N1")}"; // N: sayı formatı, 1: ondalıktan sonra 1 hane
sonuc += $"\nDurumu: \"{_durum}\"";
return sonuc;
}
}
}