DEV Community

Berkay-Dmr
Berkay-Dmr

Posted on

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 <stdio.h>
#include <stdlib.h>

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;
}
Enter fullscreen mode Exit fullscreen mode

Top comments (0)