Şub282009

C dilinde string ifadeler, iki yana yasla

Yazan : Zafer    28.02.2009 | C Notları

Karekter dizileri ile olan çalışmalarıma devam ediyorum. Bu çerçevede bu gün siz değerli okurlarımla "ayarla_project" isimli projemi paylaşmak istiyorum. Bu projenin konusuna gelince, hepimizin bildiği gibi bir çok kelime işlem programında "iki yana yasla" olarak adlandırılan bir işlem vardır. Bu işlem paragraftaki kelimelerin arasına boşluk ekleyerek sağdan ve soldan aynı hizada olmalarını sağlar. Bu şekilde paragraf daha güzel bir görüntüye sahip olur.

Bu konudan hareketle bende C dilinde bu işlemi gerçekleştirmeyi düşündüm ve orataya "ayarla_project" projesi çıktı. Kodları kısaca özetlemek gerekirse. Öncelikle paragraftan belirlediğimiz kadar karekteri okuyoruz. Bu bizim için bir satırı temsil ediyor, burada şöyle bir sorun olabilir, okuma işlemini bitirdiğimizde bir kelime sonlanmamış olabilir. Örneğin okunan son kelimenin tamamı "zafer" olsun ancak biz karekter sınırımızdan dolayı sadece "zaf" kısmını okumuş olalım bu durumda bu kelime okunan içerikten tamamen kaldırılıp sonraki satırda işleme alınmalı. Program bu durumu kontrol edip düzelttikten sonra ise oluşturduğumuz satır uzunlugu ve olması gereken uzunluktan faydalanarak satıra kaç tane boşluk ekleyeceğimizi hesaplıyoruz. Son olarak ise boşlukları ekleyip satırı ekrana yazıyoruz.

Kodların içinde yaptıkları işlerle ilgili açıklamalar bulacaksınız ancak bunlar yeterli olmazsa ilgilenen okurlarım için küçük çaplı bir dökümanda hazırladım. PDF formantındaki doküman, kullanılan kütüphaneler, sabitler ve fonksiyonlar hakkında bilgi içeriyor. Bu döküman proje klasörü içinde "doc" isimli klasörde bulunuyor. Tüm bu açıklamalardan sonra hala kafanıza takılan sorular varsa bana her zaman sitedeki iletişim bölümünden veya e-posta adresimden ulaşabilirsiniz. Tüm okuyucularıma sağlık ve mutluluk dilerim.

       CodeBlocks Proje Dosyası : ayarla_project.rar (377,56 kb)

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

#define SATIR_UZUNLUGU 79
#define BOSLUK ' '

void IkiYanaYasla(const char *str);
void SatiriDuzenle(char birSatir[], int boslukAdet);
void SatirUzunluguAyarla(const char *str, char birSatir[], int baslangicKonumu);
int SonBoslukBul(char birSatir[]);

int main()
{
    char *string = "Tarim Bakanligi iki onemli programla kucuk olcekli girisimcilere ve yatirimlarini buyutmek isteyen "
                   "KOBI'lere destek veriyor. Bunlardan ilki olan Koy Bazli Yatirim Programi dahilinde, belirlenen 16 ildeki "
                   "her bir tarimsal urun isleme tesislerine minimum 35 bin dolarlik hibe kaynak kullandirilacak. Diger "
                   "program olan Tarimsal Kalkinma Programi bunyesinde ise toplam 250 milyon YTL tutarinda kaynak, "
                   "yatirimci bekliyor. Bu yil icinde baslatilan her iki program da 2006-2010 yillari arasinda.";

    IkiYanaYasla(string);

    return 0;
}

void IkiYanaYasla(const char *str)
{
    char birSatir[SATIR_UZUNLUGU];
    int index = 0;
    int basla = 0;

    while (basla < strlen(str))
    {
        basla += index;

        /* Metinden, belirledigimiz boyutta bir satir elde ediyoruz. Basindaki ve sonundaki girintileri ekleyerek. */
        SatirUzunluguAyarla(str, birSatir, basla);

        /* Eğer elde ettiğimiz satirin son karekteri boşluk değilse, yani bir kelimeyi bölmek durumunda kalmış isek
           bu kelimeyi bir alt satıra gönderip başındaki boşluğa kadar alıyoruz */
        if (birSatir[SATIR_UZUNLUGU - 3] != BOSLUK)
            index = SonBoslukBul(birSatir);

        /* başı, sonu ve uzunluğu düzenlenmiş satirimizi uzunluga sigdirip iki yana yaslıyoruz. */
        SatiriDuzenle(birSatir, SATIR_UZUNLUGU - index - 3);

        /* gerisi ekranda */
        printf("%s\n", birSatir);
    }
}

void SatiriDuzenle(char birSatir[], int boslukAdet)
{
    char temp[SATIR_UZUNLUGU];
    int okuIndex = 0;
    int yazIndex = 0;

    while (yazIndex < SATIR_UZUNLUGU)
    {
        /* Satir basindaki ve sonundaki girintileri bozmamak icin bunlari atliyoruz. */
        if ((okuIndex == 0) || (okuIndex == 1) || (yazIndex == SATIR_UZUNLUGU - 1) || (yazIndex == SATIR_UZUNLUGU - 2))
        {
            temp[yazIndex++] =  birSatir[okuIndex++];
            continue;
        }

        if (birSatir[okuIndex] == BOSLUK)
        {
            temp[yazIndex++] = birSatir[okuIndex++];

            if ((birSatir[okuIndex] != BOSLUK) && (boslukAdet > 0))
            {
                temp[yazIndex++] = BOSLUK;
                boslukAdet--;
            }
        }
        else
            temp[yazIndex++] = birSatir[okuIndex++];

        if ((yazIndex == SATIR_UZUNLUGU - 1) && (boslukAdet > 0))
        {
            okuIndex = 0;
            yazIndex = 0;
            temp[yazIndex] = '\0';
            strcpy(birSatir, temp);
        }

    }

    temp[yazIndex] = '\0';
    strcpy(birSatir, temp);
}

void SatirUzunluguAyarla(const char *str, char birSatir[], int baslangicKonumu)
{
    int i;

    for (i=0; i<SATIR_UZUNLUGU; i++)
    {
        if ((i == 0) || (i == 1) || (i == SATIR_UZUNLUGU - 1) || (i == SATIR_UZUNLUGU - 2))
        {
            birSatir[i] = ' ';
        }
        else
        {
            if (baslangicKonumu < strlen(str))
                birSatir[i] = str[baslangicKonumu++];
            else
                birSatir[i] = ' ';
        }
    }

   birSatir[i] = '\0';
}

int SonBoslukBul(char birSatir[])
{
    int i;

    for (i=(SATIR_UZUNLUGU - 3); i>0; i--)
    {
        if (birSatir[i] == BOSLUK)
            return i-1;
        else
            birSatir[i] = '\0';
    }
    return 0;
}



Etiketler: , ,

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