none
Hatam nerde bulamıyorum RRS feed

  • Soru

  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace Yazi
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            char[] ayrac = { ' ' };
            string hece;
    
    //--------------------  Butona tıklanınca girilen cümleyi kelimelere dönüştürmek için fonksiyoa gönderiyorum
    
            private void button1_Click(object sender, EventArgs e)
            {
    
                kelime_donus(textBox1.Text);
            }
    
    //--------------------  burda girilen cümleyi kelimelere dönüştürüp sırayla 2 li hecelere ayırmak için fonksiyona gönderiyorum 
    
            string kelime_donus(string cümle)
            {
                string[] kelimeler = cümle.Split(ayrac);
    
                for (int j = 0; j <= cümle.Length; j++)
                {
                    ikili_harf_donus(kelimeler[j]);
                }
                return cümle;
            }
    
    //--------------------  bürda ayırdığım her 2 li veya tekli heceyi label2 de yazdırmak için timer1 i çalıştırıyorum
    
            string ikili_harf_donus(string kelime)
            {
                int j = 0, k = 2;
                string ikili_hece;
                string tekli_hece;
    
                for (; j <= kelime.Length; )
                {
                    try
                    {
                        k = 2;
                        ikili_hece = kelime.Substring(j, k);
                        j = j + 2;
                        hece = ikili_hece;
                    }
                    catch (Exception)
                    {
                        k = 1;
                        tekli_hece = kelime.Substring(j, k);
                        j = j + 1;
                        hece = tekli_hece;
                    }
    
                    timer1.Enabled = true;
                }
                return kelime;
            }
    
    //--------------------  label2 de yazdıkdan sonra timer kendini kapatıyor
    
            private void timer1_Tick(object sender, EventArgs e)
            {
                label2.Text = hece;
                timer1.Enabled = false;
            }
    
    //--------------------  
        }
    }
    Arkadaşlar burda amacım girilen cümleyi fonksiyonlarla önce kelimelere ayırmak sonra o kelimeleri hecelere ayırmak  1 er saniye arayla ve sırayla label 2 de yazdırmak. çalıştırıyorum ama nerde hata yaptığımı bulamadım. bir tane timer bir tane textBox  bir tane buton ve 2 tane label kullandım.

    16 Aralık 2015 Çarşamba 22:53

Yanıtlar

  •  ama kelime eğer 3-5-7 gibi tek karakterli ise 

    Kırmızı kısımlar bir şey çağrıştırıyor sanki...

    Eeeeveeeeettttt :)

            private string Hecele(string s, int count)
            {
                string kelime = s;
    
                string heceler = string.Empty;
                while (kelime.Length > 0)
                {
                    kelime.Take(count).ToList().ForEach(x => heceler += x.ToString());
                    heceler += "$";
                    int silinecek = kelime.Length >= count ? count : kelime.Length;
                    kelime = kelime.Remove(0, silinecek);
                }
                heceler += kelime;
    
                string[] heceDizi = heceler.Split(new string[] { "$" }, StringSplitOptions.RemoveEmptyEntries);
                return string.Join("-", heceDizi);
            }

    Kullanımı :

    textBox2.Text = Hecele("Denemeyazısı", 2);
    textBox3.Text = Hecele("12345678901", 3);

    @özcan : Doğrudan while bloğunda bir diziye de aktarılabilirdi. İstersen biraz uğraşarak o yöntemi de sen bulabilirsin. 

    Not : kelime.Length >= count ? ile başlayan kısım if e karşılık geliyor 


    Her şeyi denediğin halde yapamadıysan henüz denemediğin şeyler var demektir.


    17 Aralık 2015 Perşembe 10:03

Tüm Yanıtlar

  • Burada birden fazla hata var da, oncelikle timer'in ne gibi bir esprisi oldugunu anlamak lazim ama ben anlamadim. Boyle basit bir kodun try...catch'e ihtiyac duymamasi lazim, kaldi ki catch icrisine hatali kod yazilmis.
    16 Aralık 2015 Çarşamba 23:36
    Yanıtlayıcı
  • Burada birden fazla hata var da, oncelikle timer'in ne gibi bir esprisi oldugunu anlamak lazim ama ben anlamadim. Boyle basit bir kodun try...catch'e ihtiyac duymamasi lazim, kaldi ki catch icrisine hatali kod yazilmis.

    timer kullandım çünkü 1 er saniye arayla yazılmasını istiyorum. try...catch de kullanma amacım örneğin se-la-mi kelimesinin uzunluğu çift olduğu için hatasız çalışacak ama kelime eğer 3-5-7 gibi tek karakterli ise Subsitring(j,k); kullanırken j deki değer son heceye geldiğinde kelime uzunluğundan 1 karekter büyük olucak ve hata vericek program catch'i çalıştıracak kalan tek karakteri de catch'de işleme girecek.

    sizce nasıl olması gerekiyor program çalışırken derleme hatası vermiyor ama mesela textBox'a "merhaba" yazınca ikili_harf_donus(kelimeler[j]);  burda hata veriyor ve zaten sonucda da label2 de hiç bir değişiklik olmuyor

    bunu nasıl düzeltebilirim. Algoritmasını yazdım şu an programa geçirmeye çalışıyorum


    16 Aralık 2015 Çarşamba 23:58
  •  ama kelime eğer 3-5-7 gibi tek karakterli ise 

    Kırmızı kısımlar bir şey çağrıştırıyor sanki...
    17 Aralık 2015 Perşembe 08:02
  •  ama kelime eğer 3-5-7 gibi tek karakterli ise 

    Kırmızı kısımlar bir şey çağrıştırıyor sanki...

    Eeeeveeeeettttt :)

            private string Hecele(string s, int count)
            {
                string kelime = s;
    
                string heceler = string.Empty;
                while (kelime.Length > 0)
                {
                    kelime.Take(count).ToList().ForEach(x => heceler += x.ToString());
                    heceler += "$";
                    int silinecek = kelime.Length >= count ? count : kelime.Length;
                    kelime = kelime.Remove(0, silinecek);
                }
                heceler += kelime;
    
                string[] heceDizi = heceler.Split(new string[] { "$" }, StringSplitOptions.RemoveEmptyEntries);
                return string.Join("-", heceDizi);
            }

    Kullanımı :

    textBox2.Text = Hecele("Denemeyazısı", 2);
    textBox3.Text = Hecele("12345678901", 3);

    @özcan : Doğrudan while bloğunda bir diziye de aktarılabilirdi. İstersen biraz uğraşarak o yöntemi de sen bulabilirsin. 

    Not : kelime.Length >= count ? ile başlayan kısım if e karşılık geliyor 


    Her şeyi denediğin halde yapamadıysan henüz denemediğin şeyler var demektir.


    17 Aralık 2015 Perşembe 10:03
  • Evet çok iyi çalışıyor yardımlarınız için teşekkürler @Olcay GUZEL
    17 Aralık 2015 Perşembe 11:54
  • Oncelikle ben yazilan kod ile gercek hayat arasinda bag kurma egiliminde olan birisiyim o yuzden ilgisiz kod gorunce sasiriyorum. Benim "hece" diye bildigim ogrendigim sey ile senin "hece" dedigin cok farkli imis. Ornegin bana gore (daha dogrusu Turkce'de) "dört" tek hece, sana gore ise bu "dö" ve "rt" diye iki hece imis :) Suna, dosdogru, ikili harf gruplarina ayirmak istiyorum desene.

    Ikincisi, timer asenkron calisan bir sey dir. Senin dongunun icerisinde 1 sn interval verildi diye, 1 sn gecsin diye o beklemez, kod devam eder, 1 sn sonra ise o yine ne gorec verildiyse onu yapar. Senin cumlenin "hece"lenmesi milisaniyeler icerisinde bittiginden de timer'in sana herhangi bir faydasi olmaz, sadece tek "hece"yi gosterir gecer.

    Ucuncusu, try...catch, beklenen degil beklenmeyen hatalarin kontrolu icin. Ornegin bir network iletisiminin kopmasini onceden kod ile kestirmenin yolu yok, orada try ... catch kullanirsin. Ama bir seyin, cift sayida calisip, tek sayi oldugunda hata verecegini biliyorsan, bu try...catch'in isi degil. Basit matematik ve if gibi kontrollerin isi.

    Derleme hatasi vermiyor diyorsun, vermez cunku derleme acisindan bir hata yoktur. Ornegin bu da derleme hatasi vermez:

    private void Dummy(int number)
    {
      if (number < 10 && number > 10)
      {
         Console.WriteLine("Hadi canim");
      }
    }
    

    Derleyiciler o kadar da akilli degil, burada derlenme acisindan hata yok ama cok net bir hata var. Zaten programcilarin yaptigi en buyuk ve yakalanmasi zor hatalar, derleyiciden rahatca gecen hatalardir. Al sana cok tipik ve cok cok buyuk bir hatanin ornegi - hala bu hatayi yapanlar da var, bu hatanin yer aldigi ornek ve kitaplari yazanlar da (rast gelirsen cope at):

    var cmd = new SqlCommand("insert into myTable (Ad, Soyad) values ('"
      +  txtAd.Text
      + "','"
      + txtSoyad.Text
      + "')");
    

    Senin sorunun kolay cozumlerinden birisi Linq kullanmak, ancak onu kullanmadan adim adim bakalim. Sen algoritmasini yazdim diyorsun ama belli ki dogru yazamamissin (Ben algoritma kullanan birisi degilim, algoritmalarin tarih oncesi devirlerden kaldigina inanirim, onu yazana kadar gercek kodu yazar gecerim). Kodunda hem hatali, hem de gereksiz yerler var onlari tek tek gosteremeyecegim (ornegin return cümle - ne yaptin ki neyi return ediyorsun, gelen parametre zaten o, aynen geri puskurtmenin ne anlami var).   Algoritma yerine gore senin isi once pseudo kod ile parcalayalim:

    -Cumleyi Al

    -Kelimelere ayir

    -Her bir kelimeyi ikili harf gruplarina ayir ve bunlari bir dizide sakla

    -1 sn aralikla dizideki elemanlari goster.

    Bu kadar basit dort bolumde bitiyor isin. Istersen her bolumu N kere parcalarsin. Simdi de (Form dahil) kodu yazalim (tabii kelimenin Split ile parcalanamayacagini da dusunerek):

    void Main()
    {
      // Formumuz
      Form f = new Form {Text = "Kelime parcalama", Height=600, Width=800};
    
      // Cumlenin girilecegi textbox (labeli ile) - ve yaninda button
      var lblCumle = new Label {Left=10, Top=10, Width=100, Text="Cumle"};
      var txtCumle = new TextBox { Left = 120, Top = 10, Width=400 };
      var btnParcala = new Button { Left = 540, Top = 10, Text="Parcala"};
    
      // Ikili gruplarin gosterilecegi label
      var lblParca = new Label {Left=10, Top=100, Text=""};
    
      // timer
      var tmr = new System.Windows.Forms.Timer { 
        Interval = 1000, Enabled = false };
      
      
      int ikiliGrup=0;
      List<string> parcalar = new List<string>();
      
      // Clickte yapilacak
      btnParcala.Click += (sender, args) =>
      {
        if (!string.IsNullOrEmpty(txtCumle.Text))
        {
          btnParcala.Enabled = false;
          parcalar.Clear();
          ikiliGrup = 0;
          string pattern = @"\b(\w|[-'])+\b";
          foreach (Match kelime in Regex.Matches(txtCumle.Text.Trim(), pattern))
          {
            parcalar.AddRange( IkiliGruplar( kelime.Value ) ); 
          };
    
          tmr.Enabled = true;
          tmr.Start();
        }
      };
      
      // saniyede bir yapilacak
      tmr.Tick +=
         (tsender, targs) =>
         {
           if (ikiliGrup < parcalar.Count)
           {
             lblParca.Text = parcalar[ikiliGrup];
             ikiliGrup++;
           }
           else
           {
             tmr.Enabled = false;
             btnParcala.Enabled = true;
           }
         };
    
      f.Controls.AddRange(new Control[] { 
        lblCumle, txtCumle, btnParcala, lblParca });
      f.Show();
    }
    
    private List<string> IkiliGruplar(string kelime)
    {
      List<string> gruplar = new List<string>();
      for (int i = 0; i < kelime.Length / 2; i++)
      {
        gruplar.Add( kelime.Substring(i * 2, 2) );
      }
      if (kelime.Length % 2 == 1)
      {
        gruplar.Add( kelime.Substring(kelime.Length - 1) );
      }
      return gruplar;
    }


     
    17 Aralık 2015 Perşembe 13:16
    Yanıtlayıcı
  • Oncelikle ben yazilan kod ile gercek hayat arasinda bag kurma egiliminde olan birisiyim o yuzden ilgisiz kod gorunce sasiriyorum. Benim "hece" diye bildigim ogrendigim sey ile senin "hece" dedigin cok farkli imis. Ornegin bana gore (daha dogrusu Turkce'de) "dört" tek hece, sana gore ise bu "dö" ve "rt" diye iki hece imis :) Suna, dosdogru, ikili harf gruplarina ayirmak istiyorum desene.

    Ikincisi, timer asenkron calisan bir sey dir. Senin dongunun icerisinde 1 sn interval verildi diye, 1 sn gecsin diye o beklemez, kod devam eder, 1 sn sonra ise o yine ne gorec verildiyse onu yapar. Senin cumlenin "hece"lenmesi milisaniyeler icerisinde bittiginden de timer'in sana herhangi bir faydasi olmaz, sadece tek "hece"yi gosterir gecer.

    Ucuncusu, try...catch, beklenen degil beklenmeyen hatalarin kontrolu icin. Ornegin bir network iletisiminin kopmasini onceden kod ile kestirmenin yolu yok, orada try ... catch kullanirsin. Ama bir seyin, cift sayida calisip, tek sayi oldugunda hata verecegini biliyorsan, bu try...catch'in isi degil. Basit matematik ve if gibi kontrollerin isi.

    Derleme hatasi vermiyor diyorsun, vermez cunku derleme acisindan bir hata yoktur. Ornegin bu da derleme hatasi vermez:

    private void Dummy(int number)
    {
      if (number < 10 && number > 10)
      {
         Console.WriteLine("Hadi canim");
      }
    }

    Derleyiciler o kadar da akilli degil, burada derlenme acisindan hata yok ama cok net bir hata var. Zaten programcilarin yaptigi en buyuk ve yakalanmasi zor hatalar, derleyiciden rahatca gecen hatalardir. Al sana cok tipik ve cok cok buyuk bir hatanin ornegi - hala bu hatayi yapanlar da var, bu hatanin yer aldigi ornek ve kitaplari yazanlar da (rast gelirsen cope at):

    var cmd = new SqlCommand("insert into myTable (Ad, Soyad) values ('"
      +  txtAd.Text
      + "','"
      + txtSoyad.Text
      + "')");

    Senin sorunun kolay cozumlerinden birisi Linq kullanmak, ancak onu kullanmadan adim adim bakalim. Sen algoritmasini yazdim diyorsun ama belli ki dogru yazamamissin (Ben algoritma kullanan birisi degilim, algoritmalarin tarih oncesi devirlerden kaldigina inanirim, onu yazana kadar gercek kodu yazar gecerim). Kodunda hem hatali, hem de gereksiz yerler var onlari tek tek gosteremeyecegim (ornegin return cümle - ne yaptin ki neyi return ediyorsun, gelen parametre zaten o, aynen geri puskurtmenin ne anlami var).   Algoritma yerine gore senin isi once pseudo kod ile parcalayalim:

    -Cumleyi Al

    -Kelimelere ayir

    -Her bir kelimeyi ikili harf gruplarina ayir ve bunlari bir dizide sakla

    -1 sn aralikla dizideki elemanlari goster.

    Bu kadar basit dort bolumde bitiyor isin. Istersen her bolumu N kere parcalarsin. Simdi de (Form dahil) kodu yazalim (tabii kelimenin Split ile parcalanamayacagini da dusunerek):

    void Main()
    {
      // Formumuz
      Form f = new Form {Text = "Kelime parcalama", Height=600, Width=800};
    
      // Cumlenin girilecegi textbox (labeli ile) - ve yaninda button
      var lblCumle = new Label {Left=10, Top=10, Width=100, Text="Cumle"};
      var txtCumle = new TextBox { Left = 120, Top = 10, Width=400 };
      var btnParcala = new Button { Left = 540, Top = 10, Text="Parcala"};
    
      // Ikili gruplarin gosterilecegi label
      var lblParca = new Label {Left=10, Top=100, Text=""};
    
      // timer
      var tmr = new System.Windows.Forms.Timer { 
        Interval = 1000, Enabled = false };
      
      
      int ikiliGrup=0;
      List<string> parcalar = new List<string>();
      
      // Clickte yapilacak
      btnParcala.Click += (sender, args) =>
      {
        if (!string.IsNullOrEmpty(txtCumle.Text))
        {
          btnParcala.Enabled = false;
          parcalar.Clear();
          ikiliGrup = 0;
          string pattern = @"\b(\w|[-'])+\b";
          foreach (Match kelime in Regex.Matches(txtCumle.Text.Trim(), pattern))
          {
            parcalar.AddRange( IkiliGruplar( kelime.Value ) ); 
          };
    
          tmr.Enabled = true;
          tmr.Start();
        }
      };
      
      // saniyede bir yapilacak
      tmr.Tick +=
         (tsender, targs) =>
         {
           if (ikiliGrup < parcalar.Count)
           {
             lblParca.Text = parcalar[ikiliGrup];
             ikiliGrup++;
           }
           else
           {
             tmr.Enabled = false;
             btnParcala.Enabled = true;
           }
         };
    
      f.Controls.AddRange(new Control[] { 
        lblCumle, txtCumle, btnParcala, lblParca });
      f.Show();
    }
    
    private List<string> IkiliGruplar(string kelime)
    {
      List<string> gruplar = new List<string>();
      for (int i = 0; i < kelime.Length / 2; i++)
      {
        gruplar.Add( kelime.Substring(i * 2, 2) );
      }
      if (kelime.Length % 2 == 1)
      {
        gruplar.Add( kelime.Substring(kelime.Length - 1) );
      }
      return gruplar;
    }


     
    Aslında Ben Sizin Dediğiniz Gibi Yapmaya Çalışıyorum yani dört'ü dö-rt değilde direkt dört yada selam'ı se-lam diye ayırmaya çalışıyorum doğru anlamışsınız :D Ama Bunu yapmak kolay değil bende Olcay beyin verdiği kodlar üzerinde çalışıyorum dediğiniz gibi kelimeleri doğru hecelemeye çalışıyorum mükemmel çalışıyor dedim çünkü o kadar uğraşımla yaklaşamadığım şeye biraz yaklaştım. şu an her kelimeyi ayrı ayrı 2 şerli gruplara ayırabliyorum. tabiki doğru hecelemiyor sizinde dediğiniz gibi. bende düşüyorum ki her kelime aslında içerisindeki ünlü sayısı ile alakalı olarak heceleniyor mesela dört derken 1 ünlü var ve 1 hece, beş sayısı da aynı şekilde ama altı deken 2 ünlü var ve 2 hece ama yirmidokuz derken 4 ünlü ve 4 hece var ama ilk hece ve son hece 3 harfli. bunu nasıl yapabileceğimi bilmiyorum. bundan önceki bu konu hakkındaki denememde yaptığım şey şöyleydi mesela seksendör şeklinde bi giriş yapıldığıdnda se-ks-en-dö-rt diye hecelerine ayırma yerine se-k-se-n-dö-r-t diye yirmiüç girildiğinde yi-r-mi-üç diye hecelere ayırıyorum tabi buna hece denirse. daha sonra da bütün hecelerin tek tek seslerini kaydedip girilen cümleyi okuyan bir program yapmak istiyorum. ne düşünüyorsunuz düşünceleriniz benim için önemli.
    17 Aralık 2015 Perşembe 13:49
  • Duymak istedigini mi soyleyeyim, yoksa gercekten dusundugumu mu :) Gercekten dusundugum, gereksiz bir seyle ugrastigin. Bu isi icin daha ileri duzeyde programlama yapmayi bilmek gerektigi ve zaten hazirda var olan Text-To-Speech, Speech-To-Text gibi API'leri arayip bulup, eger bulursan kaynaklari, nasil yaptiklari vs incelemen. Bunlar o kadar kolay ve kisa surede yapilacak isler degil (phonetic, TTS ... diye geciyordur - yanlis hatirlamiyorsam acik kaynak kodlu uygulamalari da var. Bu arama motorundan ararsan bulursun insallah).


    17 Aralık 2015 Perşembe 14:47
    Yanıtlayıcı
  • Duymak istedigini mi soyleyeyim, yoksa gercekten dusundugumu mu :) Gercekten dusundugum, gereksiz bir seyle ugrastigin. Bu isi icin daha ileri duzeyde programlama yapmayi bilmek gerektigi ve zaten hazirda var olan Text-To-Speech, Speech-To-Text gibi API'leri arayip bulup, eger bulursan kaynaklari, nasil yaptiklari vs incelemen. Bunlar o kadar kolay ve kisa surede yapilacak isler degil (phonetic, TTS ... diye geciyordur - yanlis hatirlamiyorsam acik kaynak kodlu uygulamalari da var. Bu arama motorundan ararsan bulursun insallah).


    Teşekkürler uğraşmaya devam edicem. internette var böyle şeyler daha önce biraz baktım. ama uzun zaman oldu tekrar bakmakda fayda var dediğiniz gibi ben de ileri düzeyde programlama yok ama basit algoritmalarla çözecem inşallah çözüncede buraya atacam (Eğer yapabilirsem) :D bu arada arama motoru da bi harika :D
    17 Aralık 2015 Perşembe 15:07