Şub162009

C dilinde string ifadeler, harf adeti bulmak

Yazan : Zafer    16.02.2009 | C Notları

Merhaba, C ile metinler üzerinde farklı işlemler yapmak isteyebilirsiniz.  Eğer daha öncesinde yüksek seviyeli bil dilde program geliştirdiyseniz büyük ihtimalle öncelikle metinleri depolamak için arayacağınız veri tipi string veri tipi olacaktır. Ancak C size burada küçük bir süpriz hazırladı, hazır olun C dilinde string veri tipi bulunmuyor. Tabi ki bu string işlemleri yapamayacağımız anlamına gelmiyor. Her dilin kullanımı için gereken enstrümanları var, C dilindede string işlemleri için geliştirilen enstrümanlar mevcut mühim olan bunları ustalıkla kullanabilmeyi öğrenmek sonrasında şaşırtıcı bir esneklikle, neler yapılabildiğini göreceksiniz.

C üzerinde string işlemleri ile uğraşmaya başlayanlar için ilk örneklerden birisi metin içinde geçen harflerin toplam adetini bulmayı amaçlayan programların geliştirilmesidir. Basit bir program olmakla birlikte bazı püf noktaları gözden kaçırmamak gerekir.

Benim bu konudaki çalışmama ait kodları yazının altında bulabilirsiniz kısaca özetlemek gerekirse; öncelikle metnimdeki boslukları nokta ile doldurarak boşluklardan kurtuluyorum. Sonra herbir harfi tek tek alıp dizideki tüm harflerle karşılaştırıyorum, her bulduğum harf için harfToplam sayacımın degerini bir arttırıyorum. Döngü tamamlandığında harfToplam sayacımdaki sayı bana metinde geçen ilgili harfin toplam adedini veriyor. Ben harfleri ve degerlerini saklamak için char ve int tipinde iki tek boyutlu dizi kullandım ama bunun yerine iki boyutlu bir dizide olur düşüncesindeyim, belki bunu siz denersiniz! (olur ya denerseniz lüfen sonucu banada iletin.) Bu işlem esnasında benim istediğim harfler ve kullanım adetleri dizilerdeki yerlerine yerleşiyor.

Ancak burada bir nüans var. Örneğin a harfi metnin bir kaç yerinde geçiyor. İlk işlemde kaç tane a harfi olduğunu bulduk, string içinde ilerlerken karşımıza tekrar a harfi çıkacaktır ama biz bunu saymıştık peki bu sorunu nasıl çözebiliriz? Benim çözümün test ettiğim her harfin yerine nokta işareti yerleştirmek oldu. Belki bu nokta değilde başka bir karekterde olabilirdi ama ben bunu kullandım. Böylece sayılan harfleri otomatikman devre dışı bırakarak string içerisinde sadece sayılmayan harflerin kalmasını sağladım.Sonrasında char ve int tipindeki iki tek boyutlu dizinin yardımıyla içerdikleri değerleri ekrana yazarak sonucu kullanıcıya iletiyoruz. Ben çıktıyı biraz daha süslemek amacıyla yıldızlardan oluşan basit bir grafik gösterimide yaptım. Sonra çıktı gözüme çok karışık geldi birde onu sıraladım. (Bubble Sort)


Mühim olan yaptığınız işten keyif almaktır. Eğer işinizi severek yapıyorsanız siz istemesenizde beyniniz sizi daha güzele doğru sürükleyecek ve her işinizde daha da iyisini aramaya odaklanacaksınız Tüm okuyanlara sağlıklı ve mutlu günler dilerim.

 



       CodeBlocks Proje Dosyası : harf_say_project.rar (11,65 kb)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BOYUT 123

void BoslukDoldur(char str[]);
void HarflerriHesapla(char str[], char harf[], int deger[]);
void SonucuYaz(char harf[], int deger[]);
void DegerleriSirala(char harf[], int deger[]);

int main()
{
    char string[BOYUT] = "matematikte eratosthenes elegi belirli bir tamsayiya kadar yer alan asal sayilarin bulunmasi icin kullanilan bir yontemdir";
    char harf[BOYUT] = "\0";
    int deger[BOYUT] = {0};

    BoslukDoldur(string);
    HarflerriHesapla(string, harf, deger);
    SonucuYaz(harf, deger);
    DegerleriSirala(harf, deger);
    SonucuYaz(harf, deger);

    return 0;
}

void DegerleriSirala(char harf[], int deger[])
{
    char tmp;
    int i, j, temp;

    for (i=0; i<strlen(harf); i++)
    {
        for (j=1; j<strlen(harf); j++)
        {
            if (deger[j-1] > deger[j])
            {
                temp = deger[j-1];
                deger[j-1] = deger[j];
                deger[j] = temp;

                tmp = harf[j-1];
                harf[j-1] = harf[j];
                harf[j] = tmp;
            }
        }
    }
}

void HarflerriHesapla(char str[], char harf[], int deger[])
{
    int birHarf = '\0';
    int harfToplam = 0;
    int i, j, k=0;

    for (i=0; i<strlen(str); i++)
    {
        birHarf = str[i];
        harfToplam = 0;

        for (j=i; j<strlen(str); j++)
        {
            if ((birHarf == str[j]) && (birHarf != '.'))
            {
                str[j] = '.';
                harfToplam++;
            }
        }

        if (harfToplam > 0)
        {
            harf[k] = birHarf;
            deger[k] = harfToplam;
            k++;
        }

        str[i] = '.';
    }
}

void BoslukDoldur(char str[])
{
    int i = 0;

    for (i=0; i<strlen(str); i++)
    {
        if (str[i] == ' ')
            str[i] = '.';
    }
}

void SonucuYaz(char harf[], int deger[])
{
    int i, j;

    puts("\nMetindeki toplam harf sayisi ve grafik gosterim :\n");
    for (i=0; i<strlen(harf); i++)
    {
        if (deger[i] > 0)
            printf("  %c -> %2d ", harf[i], deger[i]);

        for (j=0; j<deger[i]; j++)
            putchar('*');

        printf("\n");
    }
}
 


Etiketler: , ,

E-mail | Permalink | Trackback | Post RSSRSS comment feed 1 Yorum

Yorumlar

08.06.2009 00:46:05

emre

c de gerçekten çok yeniyim keşke ben de böyle birşeyler yapabilsem Laughing

emre

Yorum ekle


(Gravatar simgesini gösterecek)

  Country flag

biuquote
  • Yorum
  • Canlı önizleme
Loading