Merhaba. Aşağıda C# kodumda smebol üretimi 49088 de duruyor fakat ben 456.976 farklı tek haneli sembol üretmek istiyorum, koddaki hata nerede?
C#:
using System;
using System.IO;
using System.Text;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading.Tasks;
namespace IkiliMetinVeSembolOlusturma
{
public partial class Form1 : Form.
{
private Dictionary<string, string> ikiliMetinSemboller; // İkili metin ile semboller arasındaki ilişki.
private Dictionary<string, string> sembolToIkiliMetin; // Sembol ile ikili metinler arasındaki ilişki.
private string filePath = "ikiliMetinlerVeSemboller.txt"; // Sembol ve ikili metinler dosyası yolu.
private bool sembolUretimiDevamEdiyor; // Sembol üretim durumu.
private int ikiliMetinIndex = 0; // İlk döngüdeki ilerleme.
private int kombinasyonIndex = 0; // İkinci döngüdeki ilerleme.
// İlk döngüde üretilen semboller için bir liste ekliyoruz.
private List<string> ilkDovgudeUretilenSemboller = new List<string>();
private string durumFilePath = "sembolDurumu.txt"; // Durumun kaydedileceği dosya.
private void DurumuKaydet()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(ikiliMetinIndex.ToString()); // İlk döngüdeki indeks.
sb.AppendLine(kombinasyonIndex.ToString()); // İkinci döngüdeki indeks.
// İlk döngüde üretilen sembolleri kaydet.
foreach (var sembol in ilkDovgudeUretilenSemboller)
{
sb.AppendLine(sembol);
}
File.WriteAllText(durumFilePath, sb.ToString());
}
private void DurumuYukle()
{
if (File.Exists(durumFilePath))
{
var lines = File.ReadAllLines(durumFilePath);
if (lines.Length >= 2)
{
ikiliMetinIndex = int.Parse(lines[0]); // İlk döngüdeki indeks.
kombinasyonIndex = int.Parse(lines[1]); // İkinci döngüdeki indeks.
ilkDovgudeUretilenSemboller.Clear(); // Eski sembolleri temizle.
for (int i = 2; i < lines.Length; i++)
{
ilkDovgudeUretilenSemboller.Add(lines[i]); // İlk döngüde üretilen sembolleri geri yükle.
}
}
}
}
// Sembollerin hızlıca kontrol edilmesi için HashSet eklenir.
private HashSet<string> mevcutSemboller = new HashSet<string>();
public Form1()
{
InitializeComponent();
ikiliMetinSemboller = new Dictionary<string, string>();
sembolToIkiliMetin = new Dictionary<string, string>();
sembolUretimiDevamEdiyor = false;
// Program açıldığında sembolleri dosyadan yükle.
if (File.Exists(filePath))
{
SembolleriDosyadanYukle();
mevcutSemboller = new HashSet<string>(ikiliMetinSemboller.Values); // Mevcut sembolleri HashSet'e aktar.
}
else.
{
using (File.Create(filePath)) { }
MessageBox.Show("Sembol dosyası bulunamadı, yeni bir dosya oluşturuldu. Sembolleri oluşturmak için Button1'e basın.");
}
DurumuYukle();
}
private string SembolUret(string metin)
{
int hashCode = IkiliMetinHash(metin);
int maxUnicodeValue = 0x10FFFF;
int unicodeValue = hashCode % (maxUnicodeValue + 1);
char sembol;
// Geçersiz karakterler ve benzersizlik kontrolü.
do.
{
sembol = (char)unicodeValue;
hashCode = (hashCode + 1) % 456976;
unicodeValue = hashCode % (maxUnicodeValue + 1);
}
while (
(unicodeValue >= 0xD800 && unicodeValue <= 0xDFFF) ||
mevcutSemboller.Contains(sembol.ToString()) ||
!char.IsLetterOrDigit(sembol)
);
// Yeni sembolü HashSet'e ekle.
mevcutSemboller.Add(sembol.ToString());
return sembol.ToString();
}
private async Task SembolUret()
{
await Task.Run(() =>
{
StringBuilder sb = new StringBuilder();
int sembolSayisi = ikiliMetinSemboller.Count;
for (int firstChar = ikiliMetinIndex; firstChar < 26; firstChar++)
{
for (int secondChar = (firstChar == ikiliMetinIndex ? ikiliMetinIndex : 0); secondChar < 26; secondChar++)
{
string ikiliMetin = ((char)('a' + firstChar)).ToString() + ((char)('a' + secondChar)).ToString();
if (ikiliMetinSemboller.ContainsKey(ikiliMetin))
continue;
string sembol = SembolUret(ikiliMetin);
ikiliMetinSemboller[ikiliMetin] = sembol;
sembolToIkiliMetin[sembol] = ikiliMetin;
sb.AppendLine($"{ikiliMetin}:{sembol}");
if (checkBox1.Checked)
File.AppendAllText(filePath, $"{ikiliMetin}:{sembol}\n");
ilkDovgudeUretilenSemboller.Add(sembol);
sembolSayisi++;
UpdateLabel(sembolSayisi);
if (!sembolUretimiDevamEdiyor)
{
ikiliMetinIndex = firstChar;
return;
}
}
}
// 2. Döngü: Sembolleri birleştirerek kombinasyon oluşturma.
for (int i = kombinasyonIndex; i < ilkDovgudeUretilenSemboller.Count; i++)
{
for (int j = 0; j < ilkDovgudeUretilenSemboller.Count; j++)
{
string birlesikSembol = ilkDovgudeUretilenSemboller[i] + ilkDovgudeUretilenSemboller[j];
if (!ikiliMetinSemboller.ContainsKey(birlesikSembol))
{
string yeniSembol = SembolUret(birlesikSembol);
ikiliMetinSemboller[birlesikSembol] = yeniSembol;
sembolToIkiliMetin[yeniSembol] = birlesikSembol;
sb.AppendLine($"{birlesikSembol}:{yeniSembol}");
if (checkBox1.Checked)
File.AppendAllText(filePath, $"{birlesikSembol}:{yeniSembol}\n");
sembolSayisi++;
UpdateLabel(sembolSayisi);
if (!sembolUretimiDevamEdiyor)
{
kombinasyonIndex = i;
return;
}
}
}
}
ikiliMetinIndex = 0;
kombinasyonIndex = 0;
if (!checkBox1.Checked)
SaveSembolleriDosyaya();
});
}
private async void button1_Click(object sender, EventArgs e)
{
// Checkbox durumunu değiştir.
checkBox1.Enabled = !checkBox1.Enabled;
if (!sembolUretimiDevamEdiyor)
{
// Sembol üretimini başlat.
sembolUretimiDevamEdiyor = true;
button1.Text = "Durdur"; // Buton metnini değiştir.
await SembolUret(); // Sembol üretim sürecini başlat.
}
else.
{
// Sembol üretimini durdur.
sembolUretimiDevamEdiyor = false;
button1.Text = "Başlat"; // Buton metnini değiştir.
// Eğer semboller belleğe kaydediliyorsa, dosyaya yaz.
if (!checkBox1.Checked)
{
SaveSembolleriDosyaya();
}
}
}
private void UpdateLabel(int sembolSayisi)
{
// Formun geçerli olup olmadığını kontrol et.
if (!this.IsDisposed && this.IsHandleCreated)
{
// UI güncellemelerini güvenli bir şekilde yap.
if (label1.InvokeRequired)
{
label1.Invoke(new Action(() => label1.Text = $"Üretilen Sembol Sayısı: {sembolSayisi}"));
}
else.
{
label1.Text = $"Üretilen Sembol Sayısı: {sembolSayisi}";
}
}
}
private void SaveSembolleriDosyaya()
{
StringBuilder sb = new StringBuilder();
foreach (var kvp in ikiliMetinSemboller)
{
sb.AppendLine($"{kvp.Key}:{kvp.Value}");
}
File.WriteAllText(filePath, sb.ToString());
}
private void button2_Click(object sender, EventArgs e)
{
if (ikiliMetinSemboller.Count == 0)
{
MessageBox.Show("Semboller yüklenmedi. Önce Button1'e basın veya geçerli bir sembol dosyası yükleyin.", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
// TextBox1'den metni al.
string inputText = textBox1.Text;
List<string> parcalar = new List<string>();
// Eğer metin 2 haneden uzunsa, iki karakterli parçalara ayır.
if (inputText.Length > 2)
{
for (int i = 0; i < inputText.Length; i += 2)
{
// Son bir karakter kalırsa onu ayrı al.
if (i + 1 < inputText.Length)
{
parcalar.Add(inputText.Substring(i, 2));
}
else.
{
parcalar.Add(inputText.Substring(i, 1));
}
}
}
else.
{
// Metin 2 haneden kısaysa, tamamını bir parça olarak ekle.
parcalar.Add(inputText);
}
// Parçaları sembollere dönüştür.
List<string> semboller = new List<string>();
StringBuilder sb = new StringBuilder(); // Sonucu tutmak için StringBuilder.
foreach (string parca in parcalar)
{
if (ikiliMetinSemboller.ContainsKey(parca))
{
string sembol = ikiliMetinSemboller[parca];
semboller.Add(sembol);
sb.Append(sembol); // Her sembolü yan yana yaz.
}
else.
{
MessageBox.Show($"'{parca}' için eşleşen sembol bulunamadı.", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
// Son sembolü TextBox2'ye yaz.
textBox2.Text = sb.ToString(); // Yan yana sembolleri TextBox2'ye yaz.
}
// Button3'e basıldığında sembolü çözüp orijinal metne dönüştüren metot.
private void button3_Click(object sender, EventArgs e)
{
if (sembolToIkiliMetin.Count == 0)
{
MessageBox.Show("Semboller yüklenmedi. Önce Button1'e basın veya geçerli bir sembol dosyası yükleyin.", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
// TextBox3'den sembolü al.
string inputSembol = textBox3.Text;
StringBuilder sb = new StringBuilder();
// Her sembolü orijinal metne dönüştür.
foreach (char sembol in inputSembol)
{
string sembolStr = sembol.ToString();
if (sembolToIkiliMetin.ContainsKey(sembolStr))
{
sb.Append(sembolToIkiliMetin[sembolStr]);
}
else.
{
MessageBox.Show($"'{sembolStr}' sembolü için eşleşen ikili metin bulunamadı.", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
// Son ikili metni TextBox4'e yaz.
textBox4.Text = sb.ToString();
}
private void SembolleriDosyadanYukle()
{
var lines = File.ReadAllLines(filePath);
foreach (var line in lines)
{
var parts = line.Split(':');
if (parts.Length == 2)
{
string ikiliMetin = parts[0];
string sembol = parts[1];
ikiliMetinSemboller[ikiliMetin] = sembol;
sembolToIkiliMetin[sembol] = ikiliMetin;
}
}
// Durumları sıfırla.
ikiliMetinIndex = 0;
kombinasyonIndex = 0;
}
private int IkiliMetinHash(string metin)
{
int hash = 0;
foreach (char c in metin)
{
hash = (hash * 31 + c) % 456976; // Basit bir hash fonksiyonu.
}
return hash;
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
// Checkbox işaretli ise metni değiştir.
if (checkBox1.Checked)
{
// Checkbox işaretliyken gösterilecek metin.
checkBox1.Text = "Veriler dosyaya kaydedilecek.";
}
else.
{
// Checkbox işaretli değilse gösterilecek metin.
checkBox1.Text = "Veriler sadece bellekte saklanacak.";
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// Checkbox seçilmemişse bellekteki sembolleri dosyaya kaydet.
if (!checkBox1.Checked)
{
SaveSembolleriDosyaya();
}
// Durumu kaydet.
DurumuKaydet();
Application.DoEvents();
Application.Exit();
}
}
}