Çözüldü C++ metin içinde kelime bulan kod

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.
Katılım
18 Kasım 2016
Mesajlar
540
Makaleler
1
Arkadaşlar selamlar, pazartesi vize var bir tane de coding implementation problems diye bir soru soracağını söyledi hoca ben de eski ödevleri incelerken bu kodu yazmaya çalışıyorum. Olay basit, string bir metnin içinde sizin gönderdiğiniz bir kelime var mı yok mu bunun sonucuna göre doğru veya yanlış olarak dönecek. Bu işlerde henüz yeniyim o yüzden kendi basit bilgilerimle bir şeyler denemeye çalıştım ama bu kod hep false dönüyor. Neyi yanlış yaptığımı söyleyebilir misiniz? Şimdiden teşekkür ederim.

 
Çözüm
Metinle kelimenin ilk harfini karşılaştırıyorsun iyi güzel de eğer eşitse direk true döndürüyorsun, kelimenin diğer harlerini de kontrol edip bunları doğrulaman lazım ancak o zaman true döndürebilirsin. (bu arada c stili istiyorsun diye böyle yazdım yoksa string için bir find fonksiyonu var.)

C++:
#include <iostream>
#include <string>
using namespace std;


bool bul(string metin, string kelime)
{

    for(int i=0; i < metin.size()-kelime.size()+1; ++i)
    {

        int check = 0;
        for(int c = 0; c<kelime.size(); ++c)
        {
            if(metin[i+c] == kelime[c])
            {
                check++;
            }
        }

        if(check == kelime.size())
        {
            return true;
        }

    }
  return false;
}



int main()
{
    string metin = "selamlar ben mehmet, senin adın ne?";
    string kelime = "senin";

    if(bul(metin, kelime))

    {
        cout << "buldu" << endl;
    }else
    {
        cout << "bulamadi" << endl;
    }

    return 0;
}
Metinle kelimenin ilk harfini karşılaştırıyorsun iyi güzel de eğer eşitse direk true döndürüyorsun, kelimenin diğer harlerini de kontrol edip bunları doğrulaman lazım ancak o zaman true döndürebilirsin. (bu arada c stili istiyorsun diye böyle yazdım yoksa string için bir find fonksiyonu var.)

C++:
#include <iostream>
#include <string>
using namespace std;


bool bul(string metin, string kelime)
{

    for(int i=0; i < metin.size()-kelime.size()+1; ++i)
    {

        int check = 0;
        for(int c = 0; c<kelime.size(); ++c)
        {
            if(metin[i+c] == kelime[c])
            {
                check++;
            }
        }

        if(check == kelime.size())
        {
            return true;
        }

    }
  return false;
}



int main()
{
    string metin = "selamlar ben mehmet, senin adın ne?";
    string kelime = "senin";

    if(bul(metin, kelime))

    {
        cout << "buldu" << endl;
    }else
    {
        cout << "bulamadi" << endl;
    }

    return 0;
}
 
Çözüm
Algoritma hatalı. Ayrıca if de j <<uzunlukA yapmışsın.
Algoritma hatalı çünkü string değerinin ilk harfi eşit olduğu anda True döndürüyorsun. Yukarıdaki << yerine < kullan. Bu seferde aradığın kelimenin ilk harfi cümlede var ise True döndürecek.
 
Alttaki kod ile bu işlemi yapabilirsin.
Senin koduna gelecek olursam öncelikle
1. if(a[0] == metin) çoğu zaman false dönderiyordur. Onu a yapman gerekiyor. Eğer ilk harf eşleşiyorsa gerisini kontrol etsin.
2. if bloğunda tüm for döngüsü çalışmadan eğer kelimenin ilk harfi aynı ise true dönderecek ki bu da yanlış bir şey. Orayı düzeltmek için if(metin[i+j] != a[j]) return false yapıp içteki for döngüsünün sonuna return true koyabilirsin. Eğer true'ya kadar gidiyorsa hepsi eşleşmiştir zaten.
3. for döngülerinin sınırları yanlış.

[CODE lang="cpp" title="Kelime bul"]bool bul(string metin, string kelime){

int metinSize = metin.size();
int kelimeSize = kelime.size();

for(int i=0; i <= metinSize - kelimeSize; i++){

int j;

for(j =0; j < kelimeSize; j++){
if(metin[i+j] != kelime[j]){
break;
}
}

if(j == kelimeSize){
return true;
}

}
return false;
}[/CODE]

Üstteki mesajımı düzeltemiyorum, sanırım sitede sorun var.
1. if(a[0] == metin) çoğu zaman false dönderiyordur. Onu a yapman gerekiyor. Eğer ilk harf eşleşiyorsa gerisini kontrol etsin.
 
Teşekkür ederim. İlk for döngüsünde 2 kelimenin uzunluğunu birbirinden neden çıkarttığını anlamadım sadece. Açıklayabilir misin?
 
İkinci for da metin i+c yapıyoruz metin boyutu 10 kelime boyutu 5 diyelim. Eğer o çıkarma işlemini yapmazsak metnin 6. karakterine geldiğimizde c de 5 olduğunda metin i+c 11 yapıyor ama metin boyutu 10 du doğal olarak metin dışındaki bir bellek adresine erişmeye çalışıyoruz. Bu program için sorun çıkarmayabilir ancak daha karmaşık projelerde çalışırken program çökmeleriyle karşılaşabilirsin.
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…