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

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 konuyu görüntüleyen kullanıcılar

Technopat Haberler

Yeni konular

Geri
Yukarı