10 üzerinden 2 zorluk seviyesine sahip C program projesi

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
24,632
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.


Kod:
#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 ?


Kod:
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...
 

Forum istatistikleri

Konular
7,236
Mesajlar
122,430
Üyeler
2,924
Son üye
aytu

Son kaynaklar

Son profil mesajları

Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 posta Freemont2.0 wrote on posta's profile.
Merhabalar :)
az bilgili çok meraklı
Prooffy semih_s Prooffy wrote on semih_s's profile.
Merhaba, sizden DSO2C10 hakkında bilgi rica ettim. Yanıtlarsanız sevinirim...
Unal taydin Unal wrote on taydin's profile.
Timur Bey, Arduino kontrollü bir akü şarj cihazı yapmaya çalışıyorum. Aklımdaki fikri basit bir çizim olarak konu açmıştım. Özellikle sizin fikirlerinizi çok önemsiyorum.
Back
Top