C'de malloc ve struct Kullanarak Dinamik Bir Öğrenci Not Sistemi Nasıl Yazılır?

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • MyrinNew
    Senior Member
    • Feb 2024
    • 5168

    #1

    C'de malloc ve struct Kullanarak Dinamik Bir Öğrenci Not Sistemi Nasıl Yazılır?

    C programlamada projeler geliştikçe, sabit diziler (static arrays) ve basit değişkenler yetersiz kalmaya başlar.


    Eskiden veriyi kullanıcıdan almak yerine, kodun başında dizilerin boyutunu kendim belirliyordum (Örn: ogrenci[100]). Ancak bu durum esnekliği öldürüyordu. Örneğin; kullanıcı 5 kişilik bir sınıf girmek istediğinde ama ben kodu 8 kişilik ayarladığımda, bellekte 3 kişilik yer boşuna harcanıyordu (Memory Waste).


    Bu israfın önüne geçmek ve kontrolü tamamen kullanıcıya vermek için projemde Dynamic Memory Allocation (malloc) kullanmaya karar verdim.


    🛠️ Projede Kullandığım 3 Temel Yapı

    Koda geçmeden önce, bu sistemin arkasındaki mühendislik kararlarını açıklamak isterim:


    1. Struct (Yapı) ile Veri Paketleme

    Öğrencinin adı (string), vize notu (int) ve final notu (int) birbirinden kopuk değişkenlerde durmamalıydı. Bunları typedef struct kullanarak tek bir paket haline getirdim. Böylece her öğrenci bir nesne gibi yönetilebiliyor.


    2. Malloc ile Dinamik Bellek

    Kullanıcı programı çalıştırdığında "Kaç kişi gireceksiniz?" diye soruyorum. Gelen sayı (kisi) ne kadarsa, malloc fonksiyonu ile RAM'de tam o kadar yer açıyorum.
    • Sonuç: 100 kişilik yer açıp 3 kişi kaydetmek yok. Ne lazımsa o kadar hafıza tüketimi var.


    3. Dosya İşlemleri (Append Modu)

    Verilerin kalıcı olması için .txt dosyasına yazdırıyorum. Burada fopen fonksiyonunu "a" (append) moduyla açtım.
    • Neden "w" değil? Çünkü "w" (write) modu dosyayı her seferinde sıfırlar.
    • Neden "a"? Append modu, dosya varsa açar ve imleci dosyanın en sonuna koyar. Böylece eski kayıtları silmeden, yeni öğrencileri listenin altına ekleyerek devam edebiliriz.


    💻 Kodun Tamamı

    İşte struct yapısını, dinamik bellek yönetimini ve dosya işlemlerini birleştirdiğim kod:







    c
    #include
    #include

    typedef struct {
    char name[20];
    int vize;
    int final;
    } ogrenci;

    int main(void) {
    FILE *belge;
    int i;
    int kisi;

    // Dosyayı "append" (ekleme) modunda açıyoruz
    belge = fopen("notlar.txt", "a");
    if ( belge == NULL ) {
    printf("Error opening file");
    exit(1); // Dosya açılmazsa programı güvenli şekilde kapat
    }

    printf("kisi sayisini giriniz: ");
    scanf("%d", &kisi);

    // Dinamik Bellek Tahsisi (Malloc)
    ogrenci *dizi = (ogrenci*) malloc(kisi * sizeof(ogrenci));

    for (i = 0; i < kisi; i++) {
    printf("%d. ogrenci adini giriniz: ", i+1);
    scanf("%s", dizi[i].name);

    printf("ogrenci vize giriniz: ");
    scanf("%d", &dizi[i].vize);

    printf("ogrenci final giriniz: ");
    scanf("%d", &dizi[i].final);
    }

    // Dosyaya Yazdırma
    for (i = 0; i < kisi; i++) {
    fprintf(belge, "%-10s // %-10d // %-10d \n", dizi[i].name, dizi[i].vize, dizi[i].final);
    }

    fclose(belge); // Dosyayı kapat
    free(dizi); // Belleği temizle (Memory Leak önlemi)

    printf("belge basarıyla olusturuldu ve veriler eklendi.\n");
    return 0;
    }







    More...
Working...