CodeBlanks Logo Icon CodeBlanks

Birleştirme

  • C kursu
  • Orta seviye
  • Ders 116/116
  • 6 dk

Tüm parçaları birleştirerek çalışan bir uygulama yazarsın.

Birleştirme

Son derste tüm parçaları birleştirirsin. task_free fonksiyonu, bağlı listenin tüm düğümlerini serbest bırakır. main ise oluşturma, kaydetme, yükleme, yazdırma, sayma ve temizleme adımlarını sırayla yapar.

task_free, listede dolaşır ve her düğümü free ile iade eder; sonunda *list = NULL yapar. main iki görev ekler, dosyaya kaydeder, listeyi serbest bırakır, dosyadan yükler, listeyi yazdırır, yüksek öncelikli sayısını hesaplar ve temizler. Bu, gerçek bir konsol uygulamasının iskeletidir: veri oluştur, kalıcı depola, geri yükle, göster ve temizle. Proje tamamlandığında orta seviye C becerilerin sentezlenmiş olur.

Uygulama Tüm parçaları birleştir

void task_free(Task **list) yaz; listede dolaş, her düğümü free et, *list = NULL yap. main içinde: iki görev ekle, task_save(g_list, "tasks.txt"); çağır, task_free(&g_list); yap, task_load(&g_list, "tasks.txt"); çağır, printf("liste:\n"); yaz, task_print(g_list); çağır, yüksek sayısını yazdır, task_free(&g_list); yap, printf("bitti\n"); yaz.

Başlangıç kodu

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

typedef struct Task {
    char name[32];
    int priority;
    struct Task *next;
} Task;

Task *g_list = NULL;

Task *task_new(const char *name, int priority) {
    Task *t = malloc(sizeof(Task));
    strncpy(t->name, name, 31);
    t->name[31] = '\0';
    t->priority = priority;
    t->next = NULL;
    return t;
}

void task_push_front(Task **list, Task *t) {
    t->next = *list;
    *list = t;
}

void task_print(const Task *list) {
    const Task *cur = list;
    while (cur) {
        printf("%s: %d\n", cur->name, cur->priority);
        cur = cur->next;
    }
}

typedef int (*TaskFilter)(const Task *);

int is_high_priority(const Task *t) {
    return t->priority >= 3;
}

int task_count_if(const Task *list, TaskFilter filter) {
    int count = 0;
    const Task *cur = list;
    while (cur) {
        if (filter(cur)) count++;
        cur = cur->next;
    }
    return count;
}

int task_save(const Task *list, const char *path) {
    FILE *f = fopen(path, "w");
    if (!f) return 0;
    const Task *cur = list;
    while (cur) {
        fprintf(f, "%s %d\n", cur->name, cur->priority);
        cur = cur->next;
    }
    fclose(f);
    return 1;
}

int task_load(Task **list, const char *path) {
    FILE *f = fopen(path, "r");
    if (!f) return 0;
    char name[32];
    int priority;
    while (fscanf(f, "%31s %d", name, &priority) == 2) {
        task_push_front(list, task_new(name, priority));
    }
    fclose(f);
    return 1;
}

// task_free fonksiyonunu yaz
// main'de kaydet, serbest bırak, yükle, yazdır, say, serbest bırak, bitti yazdır

int main(void) {
    task_push_front(&g_list, task_new("Ödeme", 1));
    task_push_front(&g_list, task_new("Paketle", 3));
    task_save(g_list, "tasks.txt");
    Task *cur = g_list;
    while (cur) { Task *n = cur->next; free(cur); cur = n; }
    g_list = NULL;
    task_load(&g_list, "tasks.txt");
    int high = task_count_if(g_list, is_high_priority);
    printf("yüksek: %d\n", high);
    return 0;
}

Örnek çözüm

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

typedef struct Task {
    char name[32];
    int priority;
    struct Task *next;
} Task;

Task *g_list = NULL;

Task *task_new(const char *name, int priority) {
    Task *t = malloc(sizeof(Task));
    strncpy(t->name, name, 31);
    t->name[31] = '\0';
    t->priority = priority;
    t->next = NULL;
    return t;
}

void task_push_front(Task **list, Task *t) {
    t->next = *list;
    *list = t;
}

void task_print(const Task *list) {
    const Task *cur = list;
    while (cur) {
        printf("%s: %d\n", cur->name, cur->priority);
        cur = cur->next;
    }
}

typedef int (*TaskFilter)(const Task *);

int is_high_priority(const Task *t) {
    return t->priority >= 3;
}

int task_count_if(const Task *list, TaskFilter filter) {
    int count = 0;
    const Task *cur = list;
    while (cur) {
        if (filter(cur)) count++;
        cur = cur->next;
    }
    return count;
}

int task_save(const Task *list, const char *path) {
    FILE *f = fopen(path, "w");
    if (!f) return 0;
    const Task *cur = list;
    while (cur) {
        fprintf(f, "%s %d\n", cur->name, cur->priority);
        cur = cur->next;
    }
    fclose(f);
    return 1;
}

int task_load(Task **list, const char *path) {
    FILE *f = fopen(path, "r");
    if (!f) return 0;
    char name[32];
    int priority;
    while (fscanf(f, "%31s %d", name, &priority) == 2) {
        task_push_front(list, task_new(name, priority));
    }
    fclose(f);
    return 1;
}

void task_free(Task **list) {
    Task *cur = *list;
    while (cur) {
        Task *n = cur->next;
        free(cur);
        cur = n;
    }
    *list = NULL;
}

int main(void) {
    task_push_front(&g_list, task_new("Ödeme", 1));
    task_push_front(&g_list, task_new("Paketle", 3));
    task_save(g_list, "tasks.txt");
    task_free(&g_list);
    task_load(&g_list, "tasks.txt");
    printf("liste:\n");
    task_print(g_list);
    int high = task_count_if(g_list, is_high_priority);
    printf("yüksek: %d\n", high);
    task_free(&g_list);
    printf("bitti\n");
    return 0;
}

Beklenen çıktı

liste:
Ödeme: 1
Paketle: 3
yüksek: 1
bitti

Proje tamamlandı

Tebrikler! Beş derslik görev yöneticisi projesini tamamladın. Bu projede struct, bağlı liste, fonksiyon işaretçisi ve dosya I/O kavramlarını birleştirdin.

Program artık görev oluşturuyor, listeye ekliyor, dosyaya kaydediyor, geri yüklüyor, yazdırıyor, filtreliyor ve belleği temiz bir şekilde serbest bırakıyor. Bu, orta seviye C programcısının bilmesi gereken tüm temel becerileri kapsar. İleri seviyede sistem programlama, çoklu işlem ve çekirdek temelleri seni bekliyor. Sağlam bir temel attın; bundan sonraki adımlar daha derin ve daha güçlü olacak.

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 task_free ne yapar?

  • Listeye yeni görev ekler
  • Listedeki tüm düğümleri serbest bırakır Doğru cevap
  • Listeyi dosyaya kaydeder
  • Listeyi yazdırır

Açıklama: task_free her düğümü free ile iade eder ve listeyi NULL yapar.

2 Birleştirme adımlarını eşle

Kavram Anlamı
task_push_front Görev ekle
task_save Dosyaya kaydet
task_load Dosyadan yükle
task_free Belleği temizle

3 task_free gövdesini tamamla

Soru
free(____);
Cevap
free(cur);

Açıklama: free(cur); geçerli düğümü serbest bırakır.

Orta seviye bölümündeki tüm dersler