C/C++ Girilen metinde her kelimenin kaç defa geçtiğini bulan program

KOUsoftware

Hectopat
Katılım
1 Nisan 2020
Mesajlar
159
Yer
İstanbul
Daha fazla  
Cinsiyet
Erkek
Meslek
Öğrenci
En azından nerden başlamam gerektiği konusunda fikri olan var mı?
 
Yapıp atardım ama sen kasinmissin. O yüzden anlatıyorum.

Hepsini tek seferde oku. Boşluk ve new line'a göre kelimelere ayır. Kelimeyi ve adedini tutan bir struct oluştur. O structlardan oluşan map oluştur. Her bir kelime için mapte olup olmadığına bak. Varsa adedini artir, yoksa mape yeni eleman ekle.
Sonra malın boyutu sana unique (eşsiz) kelime adedini verir. Her kelime için de structtan adedine erisirsin. Unordered map daha hızlı olacaktır. En sonda sıralı istiyorsan ben olsam map ile yapıp sonra sort ile siralarsin.
 
@Vavien. Hocamın dediğine ek olarak toplam metin miktarı + yeni metin miktarı / aranan metin işlemi ile aynı sonuç elde edilebilir. Sadece yöntem farklı.

C# da yaptığım örneği size atayım.

 
@300319 her kelimeyi istemiyor mu burada?

Şöyle hocam, metin belgesi içinde yer alan değerleri toplu olarak okuyor ve bir değişkene atıyor. Ardından o değişken üzerinde toplu bir şekilde arama yapıyor. Çok hızlı çalışan bir yapısı var. Kelime kelime arıyor tabii yine.

Bulunan değerleri Null'a çeviriyor. Bu şekilde arama hızı inanılmaz artıyor.
Null'a çevirilen değerler ise ana metinden çıkarıldığı için kelime sayısı uzunluğu azalıyor. Bu şekilde toplam aranan değer kaç tane olduğu hesaplanıyor.
 
Teşekkürler lakin c++ veya c# bilmiyorum başlıkta C diye yazmıştım da kaldırılmış.
Şöyle bir şey yaptım:
C:
#include <stdio.h>
#include <string.h>
#include <malloc.h>

int main(){
    
    char s[100];
    fgets(s,sizeof(s),stdin);
    
    char *words[100],*token=strtok(s," ");
    int i,j,x=0;

    while(token!=NULL){

        words[x++]=token;
        token=strtok(NULL," ");
    }
      
    int *dizi=calloc(x,sizeof(int));
    for(i=0;i<x;i++){
        dizi[i]++;
        for(j=i+1;j<x;j++){
             if(memcmp(words[i],words[j],strlen(words[i]))==0) {
                words[j]="0";
                dizi[i]++;
            }
        }

    }
    for(i=0;i<x;i++){
        if(words[i]!="0")
            printf("%s %d\n",words[i],dizi[i]);
    }


    return 0;
}
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…