10 üzerinden 2 zorluk seviyesine sahip C program projesi

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
21,557
Bir text dosyasındaki satır sayısını sayan programın bir gelişmiş versiyonu bu. Amaç, TIPATIP AYNI kaynak kodunu her üç işletim sistemi altında derlemek, ve ortaya çıkan programın da ilgili işletim sisteminde doğru çalıştığını teyit etmek. Buradaki hedef, işletim sisteminden bağımsız kod geliştirme yeteneği kazanmak.

Yani diyelim programın kaynak kodu countlines.c. Bu kaynak kodunu GNU/Linux altında derliyoruz, oradaki bir text dosya ile deniyoruz, sonra Windows altında derliyoruz, oradaki text dosya ile deniyoruz, en son da MacOS altında derliyoruz, oradaki text dosya ile deniyoruz. Kaynak kodunun program ieriği TIPATIP AYNI olacak, ama kaynak kodunda satır sonları, işletim sistemine göre farklılık gösterektir (Windows icin CR/LF, Linux için LF vs)
 
1621021574387.png


linuxta olduğu gibi çalıştı :cheeky2:

Bu arada 3. zorluk sorusu yok mu?
 
3. zorluk seviyesi şöyle bir problem olabilir: Bir dosyadaki satırları başka bir dosyaya kaydedecek, ama alfabetik sıralama yapacak. Tabi gene hem linux hem windows hem de macos da çalışacak.
 
3. zorluk seviyesi şöyle bir problem olabilir: Bir dosyadaki satırları başka bir dosyaya kaydedecek, ama alfabetik sıralama yapacak. Tabi gene hem linux hem windows hem de macos da çalışacak.

Hiç alfabetik sıralama yapmadığımı fark ettim.

Şu 5 harf elle nasıl sıralanır?

A
a
A
B
b

Yoksa zaten sıralımı?
 
Kendi kuralını koyabilirsin :D
 
İşime yaramayacak bir şey yazmak çok angarya geliyor bana :cheeky2:

1621159403422.png


Muhtemelen bu işi yapmanın en iyi yolu olmayabilir ama kurduğum mantık şöyle.
1. önce dosyadaki satır sayısını aldım.
2. bu satır sayısı genişliğinde iki adet dizi oluşturdum.
3. bu dizilerden biri satırın ilk harfini diğer harfin bulunduğu satır numarasını sakladı.
4. başka kütüphane istemediğim için ilk harfleri okur iken küçük harfleri kendim büyük harfe çevirdim.
5. satır başı harflerini içeren diziyi alfabetik sıraladım. bu esnada bu harlferin hangi satırlara ait olduğunu gösteren index dizimide aynı şekilde sıraladım.
6. Elimde hangi satırın aktarılacağını gösteren bir index dizisi oldu. buna göre dosyayı okuyup doğrudan yeni dosyaya yazdım.

bildiğim ve düzeltmediğim hata yeni dosyanın sonunda bir adet fazladan LF var. Onun dışında program düzgün çalışıyor.


C:
#include <stdio.h>

char dosya[]  = "list.txt";
char sdosya[] = "slist.txt";

int main()
{

    FILE* fp1 = fopen(dosya, "r");
    if (fp1 != 0)
    {
        int satir = 0;
        char OkunanKarakter;
        while (feof(fp1)== 0)
        { 
            OkunanKarakter = fgetc (fp1);
            if (OkunanKarakter==10) satir++;
        }

        rewind(fp1);
        satir++;

        //--------------------------------------
        // satırbaşlarını oku
        int index_no[satir];
        int index_data[satir];
        
        for (int k=0; k<satir; k++)
        {
            // A 65  a 97  fark 32 // a 97 - z 122 aralık
            index_no[k]=k+1;         
            OkunanKarakter = fgetc(fp1);
            if (OkunanKarakter>=97 && OkunanKarakter<=122) OkunanKarakter -= 32;
            index_data[k]=OkunanKarakter; // satırbaşı ilk karakteri al
            while (fgetc(fp1)!=10 && feof(fp1)== 0); //satır sonuna kadar git
        }
        
        //---------------------------------------
        // satırbaşlarını sırala
        int tmp;
        for (int k=0; k<satir; k++)
        {
            for (int i=0; i<satir; i++)
            {
                if (index_data[k]<index_data[i])
                {
                    tmp = index_data[k];
                    index_data[k] =index_data[i];
                    index_data[i] = tmp;
                    tmp = index_no[k];
                    index_no[k] = index_no[i];
                    index_no[i] = tmp;
                }
            }
        }

        //--------------------------------------------------
        
        FILE* fp2 = fopen(sdosya, "w");
        // aktarımı yap..
        for (int k=0; k<satir; k++)
        {       
            rewind(fp1);
            int okunan_satir=1;
            int aktarilacak_satir = index_no[k];

            while (feof(fp1)== 0)
            {     
                OkunanKarakter = fgetc (fp1);
                if (OkunanKarakter<1) break;
                if (okunan_satir==aktarilacak_satir)
                {
                    fputc(OkunanKarakter,fp2);
                    //printf("Satir : %d  Karakter : %d \n",okunan_satir,OkunanKarakter);
                }
                if (OkunanKarakter==10) okunan_satir++;
                if (okunan_satir>aktarilacak_satir) break;
            }
            // son satır aktarımı için araya satır sonu koy
            if (satir==aktarilacak_satir) fputc(10,fp2);
        }
        fclose(fp1);
        fclose(fp2);
        
    }
    else
    {
        printf("Dosya acilamadi\n");
    }
    return 0;
}


kaynak dosyadaki son satır sıralı dosyada ortalara denk geldi. Burada dikkatimi çeken şey dosya sonunda abuk bir karakter var ne olduğunu hala Anlamadım. Elimdeki hex editor ile dosyaya baktım bu karakteri göstermiyor.

1621160148436.png

Burda LF var asci 10 tamam...

Peki dosya sonunda ne var ?


C:
while (feof(fp1)== 0)
    OkunanKarakter = fgetc (fp1);

Dosya sonuna gelmeden bu son karakter -1 olarak dönüyor.

1621160222563.png
 
Sıralamayı sadece ilk harfe göre yaparsan bu doğru bir sıralama olmaz. Şu satırları düşün:

Kod:
Bir ben
Bir sen
Bir de o

Sıralamanın tüm satırı gözönünde bulundurularak yapılması lazım.

Bir de dosyaları her seferinde tek karakter okutursan ve tek karakter yazdırırsan büyük dosyalarda bu işlem çok çok uzun sürer.
 
Kendi kuralını koyabilirsin :D

Sıralamayı sadece ilk harfe göre yaparsan bu doğru bir sıralama olmaz. Şu satırları düşün:

Kendi kuralımı koydum :D

Neyse olayı anladım. Tam doğrusunu benden sonraki meraklı arkadaşa bırakıyorum. :p

Bir de dosyaları her seferinde tek karakter okutursan ve tek karakter yazdırırsan büyük dosyalarda bu işlem çok çok uzun sürer.

işte kendimce rami az kullandım. geç olsun temiz olsun...
 

Çevrimiçi personel

Forum istatistikleri

Konular
5,659
Mesajlar
97,347
Üyeler
2,438
Son üye
İbrahimSönmez

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top