Çözüldü C#'ta yazılan kodun çıktısında soru işareti işareti çıkıyor

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.
Katılım
22 Aralık 2023
Mesajlar
307
Çözümler
2
Beğeniler
265
Yer
Amasya, Türkiye
C# yazılım dilinde kredi faizi ve taksidini hesaplayan bir program yazdım ancak "?" işaretinin neden çıktığını bir türlü bulamadım.

C#:
#region Class Project 10 - Kredi Faiz ve Taksit Hesaplama

// Kredi türleri için enum
public enum KrediTuru
{
     IhtiyacKredisi = 1,
     EvKredisi,
     SaglikKredisi,
     AracKredisi,
     EgitimKredisi,
     TicariKredi
}

// Kullanıcı bilgilerini tutan class
public class Kullanici
{
     public string Ad { get; set; }
     public string Soyad { get; set; }
     public int Yas { get; set; }
     public string Meslek { get; set; }
     public decimal AylikGelir { get; set; }

     public void BilgileriGoster()
     {
         Console.WriteLine("\n=== KULLANICI BİLGİLERİ ===");
         Console.WriteLine($"Ad-Soyad: {Ad} {Soyad}");
         Console.WriteLine($"Yaş: {Yas}");
         Console.WriteLine($"Meslek: {Meslek}");
         Console.WriteLine($"Aylık Gelir: {AylikGelir:C}");
     }
}

// Kredi işlemlerini yapan class
public class KrediHesaplama
{
     private Kullanici kullanici;
     private KrediTuru krediTuru;
     private decimal krediTutari;
     private int taksitSayisi;
     private decimal faizOrani;

     // Constructor
     public KrediHesaplama(Kullanici kullanici)
     {
         this.kullanici = kullanici;
     }

     // Faiz oranlarını belirleme
     private void FaizOraniBelirle()
     {
         switch (krediTuru)
         {
             case KrediTuru.IhtiyacKredisi:
                 this.faizOrani = 0.0449m; // Aylık %4.49
                 break;
             case KrediTuru.EvKredisi:
                 this.faizOrani = 0.0279m; // Aylık %2.79
                 break;
             case KrediTuru.SaglikKredisi:
                 this.faizOrani = 0.0199m; // Aylık %1.99
                 break;
             case KrediTuru.AracKredisi:
                 this.faizOrani = 0.0319m; // Aylık %3.19
                 break;
             case KrediTuru.EgitimKredisi:
                 this.faizOrani = 0.0259m; // Aylık %2.59
                 break;
             case KrediTuru.TicariKredi:
                 this.faizOrani = 0.0379m; // Aylık %3.79
                 break;
             default:
                 this.faizOrani = 0.0349m;
                 break;
         }
     }

     // Kredi detaylarını alma
     public void KrediDetaylariniAl()
     {
         Console.WriteLine("\n=== KREDİ TÜRLERİ ===");
         Console.WriteLine("1. İhtiyaç Kredisi");
         Console.WriteLine("2. Ev Kredisi (Mortgage)");
         Console.WriteLine("3. Sağlık Kredisi");
         Console.WriteLine("4. Araç Kredisi");
         Console.WriteLine("5. Eğitim Kredisi");
         Console.WriteLine("6. Ticari Kredi");

         Console.Write("\nKredi türünü seçin (1-6): ");
         int secim = int.Parse(Console.ReadLine());

         if (secim < 1 || secim > 6)
         {
             Console.WriteLine("Geçersiz seçim! Varsayılan olarak İhtiyaç Kredisi seçildi.");
             secim = 1;
         }

         this.krediTuru = (KrediTuru)secim;

         Console.Write("Kredi tutarını girin (TL): ");
         this.krediTutari = decimal.Parse(Console.ReadLine());

         Console.Write("Taksit sayısını girin (ay): ");
         this.taksitSayisi = int.Parse(Console.ReadLine());

         // Faiz oranını belirle
         FaizOraniBelirle();
     }

     // Aylık taksit hesaplama
     public decimal AylikTaksitHesapla()
     {
         // Formül: (AnaPara * Faiz * (1+Faiz)^Taksit) / ((1+Faiz)^Taksit - 1)
         decimal aylikFaiz = this.faizOrani;
         decimal pay = krediTutari * aylikFaiz * (decimal)Math.Pow((double)(1 + aylikFaiz), taksitSayisi);
         decimal payda = (decimal)Math.Pow((double)(1 + aylikFaiz), taksitSayisi) - 1;

         return pay / payda;
     }

     // Toplam geri ödeme tutarı
     public decimal ToplamGeriOdeme()
     {
         return AylikTaksitHesapla() * taksitSayisi;
     }

     // Toplam faiz tutarı
     public decimal ToplamFaiz()
     {
         return ToplamGeriOdeme() - krediTutari;
     }

     // Kredi uygunluk kontrolü
     public bool KrediUygunlukKontrol()
     {
         // Yaş kontrolü
         if (kullanici.Yas < 18 || kullanici.Yas > 65)
         {
             Console.WriteLine("Yaşınız kredi almak için uygun değil!");
             return false;
         }

         // Taksit/Gelir oranı kontrolü
         decimal aylikTaksit = AylikTaksitHesapla();
         decimal taksitGelirOrani = (aylikTaksit / kullanici.AylikGelir) * 100;

         if (taksitGelirOrani > 60)
         {
             Console.WriteLine($"Aylık taksit tutarı ({aylikTaksit:C}) gelirinizin %60'ını ({taksitGelirOrani:F2}%) aşıyor!");
             return false;
         }

         // Minimum gelir kontrolü
         if (kullanici.AylikGelir < 5000)
         {
             Console.WriteLine("Aylık geliriniz minimum 5.000 TL olmalıdır!");
             return false;
         }

         return true;
     }

     // Kredi detaylarını gösterme
     public void KrediDetaylariniGoster()
     {
         Console.WriteLine("\n=== KREDİ DETAYLARI ===");
         Console.WriteLine($"Kredi Türü: {krediTuru}");
         Console.WriteLine($"Kredi Tutarı: {krediTutari:C}");
         Console.WriteLine($"Taksit Sayısı: {taksitSayisi} ay");
         Console.WriteLine($"Aylık Faiz Oranı: {faizOrani * 100:F2}%");
         Console.WriteLine($"Yıllık Faiz Oranı (APR): {faizOrani * 12 * 100:F2}%");
         Console.WriteLine($"Aylık Taksit: {AylikTaksitHesapla():C}");
         Console.WriteLine($"Toplam Geri Ödeme: {ToplamGeriOdeme():C}");
         Console.WriteLine($"Toplam Faiz: {ToplamFaiz():C}");
     }

     // Kredi özet tablosu
     public void KrediOzetTablosu()
     {
         if (!KrediUygunlukKontrol())
         {
             Console.WriteLine("\nKredi başvurunuz uygun görülmemiştir.");
             return;
         }

         Console.WriteLine("\n=== KREDİ ÖZET TABLOSU ===");
         kullanici.BilgileriGoster();
         KrediDetaylariniGoster();

         Console.WriteLine("\n=== TAKSİT TABLOSU ===");
         decimal kalanAnaPara = krediTutari;
         decimal aylikTaksit = AylikTaksitHesapla();

         for (int ay = 1; ay <= taksitSayisi; ay++)
         {
             decimal aylikFaizTutari = kalanAnaPara * faizOrani;
             decimal aylikAnaParaOdemesi = aylikTaksit - aylikFaizTutari;
             kalanAnaPara -= aylikAnaParaOdemesi;

             Console.WriteLine($"{ay}. Ay: Taksit: {aylikTaksit:C} | " +
                             $"Anapara: {aylikAnaParaOdemesi:C} | " +
                             $"Faiz: {aylikFaizTutari:C} | " +
                             $"Kalan: {kalanAnaPara:C}");
         }
     }
}

class Program
{
     static void Main(string[] args)
     {
         Console.WriteLine("=== KREDİ HESAPLAMA PROGRAMI ===");

         // Kullanıcı bilgilerini alma
         Kullanici kullanici = new Kullanici();

         Console.Write("Adınız: ");
         kullanici.Ad = Console.ReadLine();

         Console.Write("Soyadınız: ");
         kullanici.Soyad = Console.ReadLine();

         Console.Write("Yaşınız: ");
         kullanici.Yas = int.Parse(Console.ReadLine());

         Console.Write("Mesleğiniz: ");
         kullanici.Meslek = Console.ReadLine();

         Console.Write("Aylık Geliriniz (TL): ");
         kullanici.AylikGelir = decimal.Parse(Console.ReadLine());

         // Kredi hesaplama nesnesi oluşturma
         KrediHesaplama krediHesaplama = new KrediHesaplama(kullanici);

         // Kredi detaylarını alma
         krediHesaplama.KrediDetaylariniAl();

         // Sonuçları gösterme
         krediHesaplama.KrediOzetTablosu();

         Console.WriteLine("\nProgram sonlandı. Çıkmak için bir tuşa basın...");
         Console.ReadKey();
     }
}

#endregion

 
Çözüm

Senin kodda bir hatan yok. konsolun karakter kodlamasından (encoding) kaynaklanıyor.
Ekranda gördüğün ? işaretleri, Türk lirası sembolü (₺) doğru gösterilemediği için çıkıyor.
ASCII maalesef TL işaretini desteklemiyor.
Sadece TL kullanacaksan;

C#:
Console.WriteLine($"Aylık Gelir: {AylikGelir:N2} TL");

Ya da (nasıl yapıldığını bilmiyorum) utf-8'e alabilirsin Console encodingi. (Hatam olabilir kusura bakmayın)

Öğrenip geldim:
Kodundaki Program class'ının içindeki Main metodunu şu şekilde güncelleyebilirsin:
C#:
static void Main(string[] args)
{
    // eklenecek satır:
    Console.OutputEncoding = System.Text.Encoding.UTF8;

    Console.WriteLine("=== KREDİ HESAPLAMA PROGRAMI ===");

    // kodun geri kalanı aynı şekilde devam ediyor
    
    // Kullanıcı bilgilerini alma
    Kullanici kullanici = new Kullanici();
    
    // ...
}

Senin kodda bir hatan yok. konsolun karakter kodlamasından (encoding) kaynaklanıyor.
Ekranda gördüğün ? işaretleri, Türk lirası sembolü (₺) doğru gösterilemediği için çıkıyor.
ASCII maalesef TL işaretini desteklemiyor.
Sadece TL kullanacaksan;

C#:
Console.WriteLine($"Aylık Gelir: {AylikGelir:N2} TL");

Ya da (nasıl yapıldığını bilmiyorum) utf-8'e alabilirsin Console encodingi. (Hatam olabilir kusura bakmayın)

Öğrenip geldim:
Kodundaki Program class'ının içindeki Main metodunu şu şekilde güncelleyebilirsin:
C#:
static void Main(string[] args)
{
    // eklenecek satır:
    Console.OutputEncoding = System.Text.Encoding.UTF8;

    Console.WriteLine("=== KREDİ HESAPLAMA PROGRAMI ===");

    // kodun geri kalanı aynı şekilde devam ediyor
    
    // Kullanıcı bilgilerini alma
    Kullanici kullanici = new Kullanici();
    
    // ...
}
 
Çözüm

Teşekkür ederim.

Kodda hata yok gibi gözüküyor. Türkçe karakterlerden oluyor olabilirmi?

Evet dostum, bu yüzden kaynaklanıyormuş.

Varsayılan ayarların ₺ simgesini tanıyamıyor hocam.
Main metodun en başına şu satırı eklemen yeterli okacaktır.
Kod:
Console.OutputEncoding = System.Text.Encoding.UTF8;
]

Teşekkürler.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…